下面的正则表达式匹配所有被单个星号字符紧密包围的序列,这就是斜体文本在 Markdown 中强调的方式。我想格式化文本,包括用于强调的星号。除此之外,我确实允许在序列中使用独立的星号。示例 *This is italic textn with * in between*
.
/*[^*s]([^*]|(*s))*[^*s]*/g
此外,在 Markdown 中,粗体文本通过双星号字符强调非常相似。为了匹配这些,我使用这个正则表达式:
/**[^*s]([^*]|(*s))*[^*s]**/g
两者都有自己的工作,但当一起应用时,粗体文本的内部也会被检测为斜体文本。因此,除了外部星号外,格式化文本既粗体又斜体。为了解决这个问题,我必须表达斜体序列不允许被第二对星号包裹。
问题是[^*]
需要任何其他字符,因此根本不需要一个字符。如果周围有额外的星号,而仍然在搜索字符串的开头或结尾匹配,我该如何表达上面的第一个正则表达式不匹配?
请注意,我使用 JavaScript,因此没有可用的背后资料。
编辑:由于我误解了这个问题,我向您提出一种具有约束的新模式:
/*((?:[^s*]+|s+*?)*)?*/
有趣的是,整个模式包含标记,捕获组包含其中的内容。请注意,内容是可选的("**"
是空内容周围的有效标记)
旧帖子:
您询问的内容是不可能的,因为没有规则可以选择字符串中的哪个星号是结束星号。如果要使用星号作为标记,则必须要求用户转义文本星号。
示例字符串:
*This is italic textn with * in between* text *an other italic part* text
要处理此类字符串,可以使用此模式来避免转义字符:
/*(?:[^*\]+|\{2}|\[sS])**/
说"没有字符,或者没有*字符":
(^|[^*])
最有可能的是,字符类中的转义是多余的:
(^|[^*])
这同样适用于结束标记:
($|[^*])