我确定有人已经问过这个问题,但是我不知道要在Google中搜索哪些词才能找到这些答案。
我必须将带有标记的文本“翻译”为html(或rtf或xaml)。 “粗体”的标记为*。如果我希望粗体文本包含文字*我必须用反斜杠将其屏蔽。
所以标记的文字...
This is *ju\*st* a test.
...应翻译为“这是 ju * st 测试”。
我正在寻找一种正则表达式模式,以使所有匹配的内容都可以在标记的文本中“翻译”为粗体。
现在,我坚持使用这个(一个恒星,后面跟着一个或多个不是恒星的字符(尽可能少),再跟一个恒星)
\*[^*]+?\*
但是如何增强“一个或多个不是星星的字符”部分,以免停在以反斜杠开头的星星上?
如果两种语言之间存在差异,我想在.NET项目中使用此正则表达式。
答案 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
字符转义的任何字符(换行符除外,用\
编译模式以允许任何转义的字符)[^\\*]*
-除\
和*
以外的零个或多个字符)*
-零次或多次\*
-一个*
字符。