我敢肯定已经有人问过这个问题,但我不知道该寻找什么话在谷歌找到这些问题的答案。
我要“翻译”与标记为HTML(或RTF或XAML)一文。对于“大胆”的标记为*。如果我想大胆的文本包含文字·我有一个反斜杠来掩盖它。
因此,标记文本...
This is *ju\*st* a test.
...应该翻译成“这是菊* ST的测试。”
我正在寻找一个正则表达式来获得所有的比赛,以“翻译”里面我的标记文本加粗。
现在我只能和这一个(字面星之后是不是明星(尽可能少的一个或多个字符),其次是文字星)
\*[^*]+?\*
但我怎么能增强“是不是明星一个或多个字符”部分根本不被前面有一个反斜杠明星停下来?
我想在.NET项目中使用这个表达式,万一有语言之间的差异。
您可以使用
(?<=(?<!\\)(?:\\{2})*)\*[^\\*]*(?:\\.[^\\*]*)*\*
细节
(?<=(?<!\\)(?:\\{2})*)
- 一个积极的回顾后,使确保没有\
逃逸字符的当前位置之前。换句话说,它匹配的是立即前面有一个位置:
(?<!\\)
- 没有\
焦炭随后用
(?:\\{2})*
- 双反斜线的任何零次或多次重复\*
- 零或小于*
和[^\\*]*
等多个字符\
- 非捕获组匹配的开始......
*
- 任何字符(除换行符其他,编译图案(?:
以允许任何转义字符)用\\.
炭逃脱
RegexOptions.Singleline
- 零或小于\
和[^\\*]*
等多个字符\
- 零次或多次你想从一个标记星到另一种标记明星赛。在你的标记语言,文字明星其实不仅是*
,但)*
。在正则表达式,这相当于通过\*
:反斜杠,必须逃脱,然后一个明星,那也必须被转义。
因此,你需要指定你的模式,你正在寻找一个标记的明星,而不是字面的明星。
*
这是有点过,但因为*
是贪婪的,所以在\*
,它会在整个字符串匹配,从第一个到最后一个明星。
您可以使用星改性剂的懒惰/非贪婪版本:\\\*
在大多数发动机。因此,它变成了:
\*.*[^\\]\*
\* a markup star
.* followed by any character
[^\\]\* then a markup star, that is, one not escaped by a backslash
小试与Python:
.*
如果您正则表达式引擎不支持懒惰改性剂,就需要明确这种行为:
"*ju\*st* *ju\*st*