我已经阅读了其他有类似问题的线程。但没有特定于这种情况 - 如果我在主简码中包含相同类型的短代码怎么办
所以这是演示简码 - http://regexr.com/3a1r6
输入
[cigar] [cigar] [cigar] ceva [/cigar] [/cigar] [/cigar] ceva [cigar] [cigar] [cigar] alceva [/cigar] [/cigar] [/cigar]
测试正则表达式
'[cigar].*?'['/cigar']
正确的输出是 -
[cigar] [cigar] [cigar] ceva [/cigar] [/cigar] [/cigar]
不
[cigar] [cigar] [cigar] ceva [/cigar]
有什么解决方案吗?
只需添加一个负面的前瞻断言,如下所示,
'[cigar].*?'['/cigar'](?!'s*'['/)
演示
(?!'s*'['/)
Negative Lookforward 断言匹配后将跟任何空格,但不是一个或多个空格,后面是[/
符号。
根据你在做什么,这并不重要。
假设我正在编写一个BBCode解析器,我有这个要处理:
[b] [b] [b] Triple bold for some reason! [/b] [/b] [/b]
所以我有一个正则表达式,比如/'[b'](.*?)'['/b']/
=> "<b>$1</b>"
如果我反复应用替换直到它不再改变任何内容,结果是:
<b> <b> <b> Triple bold for some reason! </b> </b> </b>
就浏览器而言,我有三个完全有效的嵌套元素,即使当我解析它们时,我也不是从外向内做的。
另一种选择是从最后一个匹配到第一个。这将通过以下方式
完成 /'[b'](.*?)'['/b'](?!.*'[b'])/
这将匹配最后一个[b]
,以及它后面的第一个[/b]
- 换句话说,最里面的嵌套对。同样,重复应用直到没有任何变化将导致所有对被解析,但这次它们实际上将以"正确"的顺序解析。(请注意,上述正则表达式在大输入上可能很慢或效率低下 - 请谨慎使用)