下面的正则表达式匹配由单个星号字符紧密包围的所有序列,这就是Markdown中强调斜体文本的方式。我想格式化文本,包括用于强调的星号。除此之外,我还允许在序列中使用独立的星号。示例*This is italic text\n with * in between*
。
/\*[^\*\s]([^\*]|(\*\s))*[^\*\s]\*/g
此外,在Markdown中,通过双星号字符强调粗体文本非常相似。为了匹配这些,我使用这个正则表达式:
/\*\*[^\*\s]([^\*]|(\*\s))*[^\*\s]\*\*/g
两者都适用于他们自己,但是当一起应用时,粗体文本的内部部分也被检测为斜体文本。因此除了外部星号外,格式化的文本都是粗体和斜体。为了解决这个问题,我不得不表示斜体序列不允许被第二对星号包裹。
问题是[^\*]
需要任何其他角色,因此需要一个角色。我如何表达上面的第一个正则表达式是否匹配,如果它们是附加的星号,同时仍然匹配搜索字符串的开头或结尾?
作为一个注释,我使用JavaScript,因此没有可用的背后。
答案 0 :(得分:1)
你可以说“没有字符,或非*字符”:
(^|[^\*])
并且很可能,字符类中的转义是多余的:
(^|[^*])
同样适用于结束标记:
($|[^*])
答案 1 :(得分:1)
编辑:由于我误解了这个问题,我建议您使用约束条件的新模式:
/\*((?:[^\s*]+|\s+\*?)*)?\*/
兴趣在于整个模式包含标记,捕获组包含内容。请注意,内容是可选的("**"
是空内容周围的有效标记)
旧帖子:
你问的是不可能的,因为没有规则可以选择字符串中的哪个星号是结束星号。如果要将星号用作标记,则必须要求用户使用文字星号。
示例字符串:
*This is italic text\n with \* in between* text *an other italic part* text
要处理这种字符串,您可以使用此模式来避免转义字符:
/\*(?:[^*\\]+|\\{2}|\\[\s\S])*\*/