4

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

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

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

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

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

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

作为说明,我使用 JavaScript,因此没有可用的查看。

4

2 回答 2

1

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

(^|[^\*])

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

(^|[^*])

同样适用于结束标记:

($|[^*])
于 2013-11-09T11:37:28.670 回答
1

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

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

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


旧帖

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

示例字符串:

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

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

/\*(?:[^*\\]+|\\{2}|\\[\s\S])*\*/
于 2013-11-09T12:08:07.367 回答