正则表达式查找标记

时间:2019-02-01 21:54:44

标签: regex

我确定有人已经问过这个问题,但是我不知道要在Google中搜索哪些词才能找到这些答案。

我必须将带有标记的文本“翻译”为html(或rtf或xaml)。 “粗体”的标记为*。如果我希望粗体文本包含文字*我必须用反斜杠将其屏蔽。

所以标记的文字...

This is *ju\*st* a test.

...应翻译为“这是 ju * st 测试”。

我正在寻找一种正则表达式模式,以使所有匹配的内容都可以在标记的文本中“翻译”为粗体。

现在,我坚持使用这个(一个恒星,后面跟着一个或多个不是恒星的字符(尽可能少),再跟一个恒星)

\*[^*]+?\*

但是如何增强“一个或多个不是星星的字符”部分,以免停在以反斜杠开头的星星上?

如果两种语言之间存在差异,我想在.NET项目中使用此正则表达式。

2 个答案:

答案 0 :(得分:1)

您想将一个标记星与另一个标记星进行匹配。 在你的标记语言,文字明星其实不仅是*,{但{1}}。 在正则表达式中,此翻译为\*:必须转义的反斜杠,然后也必须转义的星形。

因此,您需要在模式中指定要查找标记星,而不是文字星

\\\*

这有点差,因为\*.*[^\\]\* \* a markup star .* followed by any character [^\\]\* then a markup star, that is, one not escaped by a backslash 很贪婪,所以在.*中,它将匹配从头到尾的整个字符串。

您可以在大多数引擎中使用星形修饰符的懒惰/非贪婪版本:"*ju\*st* *ju\*st*。 这样就变成了:

*?

尝试使用Python:

\*.*?[^\\]\*

\*             a markup star
  .*?          followed by any character, but as few as possible
     [^\\]\*   then a markup star, that is, one not escaped by a backslash

如果您的正则表达式引擎不支持惰性修饰符,则需要明确此行为:

>>> s = r"*ju\*st* *ju\*st*"
>>> re.match(r"\*.*[^\\]\*", s)
<re.Match object; span=(0, 17), match='*ju\\*st* *ju\\*st*'>
>>> re.match(r"\*.*?[^\\]\*", s)
<re.Match object; span=(0, 8), match='*ju\\*st*'>

答案 1 :(得分:1)

您可以使用

(?<=(?<!\\)(?:\\{2})*)\*[^\\*]*(?:\\.[^\\*]*)*\*

请参见.NET regex demo

详细信息

  • (?<=(?<!\\)(?:\\{2})*)-向后看的肯定,可以确保在当前位置之前没有\转义字符。换句话说,它匹配的是立即前面有一个位置:
    • (?<!\\)-不包含\字符,后跟
    • (?:\\{2})*-两次反斜杠的零个或多个重复
  • \*-一个*字符
  • [^\\*]*-除\*以外的零个或多个字符
  • (?:-开始非捕获组匹配...
    • \\.-用RegexOptions.Singleline字符转义的任何字符(换行符除外,用\编译模式以允许任何转义的字符)
    • [^\\*]*-除\*以外的零个或多个字符
  • )*-零次或多次
  • \*-一个*字符。