如何在正则表达式中表达“不包括边界的这个字符”?

时间:2013-11-09 11:34:49

标签: javascript regex

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

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

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

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

两者都适用于他们自己,但是当一起应用时,粗体文本的内部部分也被检测为斜体文本。因此除了外部星号外,格式化的文本都是粗体和斜体。为了解决这个问题,我不得不表示斜体序列不允许被第二对星号包裹。

问题是[^\*]需要任何其他角色,因此需要一个角色。我如何表达上面的第一个正则表达式是否匹配,如果它们是附加的星号,同时仍然匹配搜索字符串的开头或结尾?

作为一个注释,我使用JavaScript,因此没有可用的背后。

2 个答案:

答案 0 :(得分:1)

你可以说“没有字符,或非*字符”:

(^|[^\*])

并且很可能,字符类中的转义是多余的:

(^|[^*])

同样适用于结束标记:

($|[^*])

答案 1 :(得分:1)

编辑:由于我误解了这个问题,我建议您使用约束条件的新模式:

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

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


旧帖子

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

示例字符串:

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

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

/\*(?:[^*\\]+|\\{2}|\\[\s\S])*\*/