如何在正则表达式中表示“不包括边界的此字符”

How to express "Not this character including boundary" in a regular expression?

本文关键字:边界 字符 不包括 正则表达式 表示      更新时间:2023-09-26

下面的正则表达式匹配所有被单个星号字符紧密包围的序列,这就是斜体文本在 Markdown 中强调的方式。我想格式化文本,包括用于强调的星号。除此之外,我确实允许在序列中使用独立的星号。示例 *This is italic text'n with * in between* .

/'*[^'*'s]([^'*]|('*'s))*[^'*'s]'*/g

此外,在 Markdown 中,粗体文本通过双星号字符强调非常相似。为了匹配这些,我使用这个正则表达式:

/'*'*[^'*'s]([^'*]|('*'s))*[^'*'s]'*'*/g

两者都有自己的工作,但当一起应用时,粗体文本的内部也会被检测为斜体文本。因此,除了外部星号外,格式化文本既粗体又斜体。为了解决这个问题,我必须表达斜体序列不允许被第二对星号包裹。

问题是[^'*]需要任何其他字符,因此根本不需要一个字符。如果周围有额外的星号,而仍然在搜索字符串的开头或结尾匹配,我该如何表达上面的第一个正则表达式不匹配?

请注意,我使用 JavaScript,因此没有可用的背后资料。

编辑:由于我误解了这个问题,我向您提出一种具有约束的新模式:

/'*((?:[^'s*]+|'s+'*?)*)?'*/

有趣的是,整个模式包含标记,捕获组包含其中的内容。请注意,内容是可选的("**"是空内容周围的有效标记)


旧帖子

您询问的内容是不可能的,因为没有规则可以选择字符串中的哪个星号是结束星号。如果要使用星号作为标记,则必须要求用户转义文本星号。

示例字符串:

*This is italic text'n with '* in between* text *an other italic part* text

要处理此类字符串,可以使用此模式来避免转义字符:

/'*(?:[^*'']+|''{2}|''['s'S])*'*/
你可以

说"没有字符,或者没有*字符":

(^|[^'*])

最有可能的是,字符类中的转义是多余的:

(^|[^*])

这同样适用于结束标记:

($|[^*])