正则表达式类似于WordPress短代码


Regex expression similar to WordPress shortcodes

我已经阅读了其他有类似问题的线程。但没有特定于这种情况 - 如果我在主简码中包含相同类型的短代码怎么办

所以这是演示简码 - 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] - 换句话说,最里面的嵌套对。同样,重复应用直到没有任何变化将导致所有对被解析,但这次它们实际上将以"正确"的顺序解析。(请注意,上述正则表达式在大输入上可能很慢或效率低下 - 请谨慎使用)