Regex如何向前看,看看是否还有另一个匹配的结束部分


Regex how to look ahead and see if there is another matching end part?

我使用正则表达式模式来查找[code][/code]BB标记的实例。(这是在PHP中使用preg_match/preg_relace/etc的珍珠型正则表达式)

'~'[code'](.*?)'['/code']~is'

好吧,我的问题是,我如何才能让别人打出这样的东西:

[code][code]code here[/code][/code]

键入此内容的目的是向新手演示如何将代码放入[code][/code]标记中。

目前,如果我键入它,正则表达式将停止在"[/code]"的第一个实例,而不会一直向前看"[code]"的第二个实例

由于我是新用户,所以无法发布图像,但以下是输出的屏幕截图:https://i.stack.imgur.com/7gS6x.png

我知道正则表达式中有一个术语叫做"积极展望"answers"消极展望",但我不太确定它们的意思,也不太确定他们是否与我的情况有关。有人能帮我一下吗?非常感谢。

编辑:很抱歉,我似乎没有足够的代表来+1任何东西。我真的很感激你的帮助,而且很快

您可以尝试这种模式的

'~'[code'](.*?)('['/code'])+~is'

如果您还想讨论两个结束标记之间可能有更多代码的情况,您可以尝试这个

'[code'].*?'['/code'](?:(?:(?!'[code']).)*'['/code'])?

在Regexr 上查看

第一部分CCD_ 1从第一打开标签匹配到第一关闭标签。

然后是棘手的部分,它现在是可选的(?:(?:(?!'[code']).)*'['/code'])?是匹配字符,如果后面没有开始标记,直到找到最后一个结束标记。

您所看到的只是删除(.*?) 中的?

对于?,它是一个惰性匹配,将尽可能少地匹配几个字符,这就是为什么它在看到第一个[/code] 时停止的原因

如果没有?,这是一个贪婪的匹配,将匹配尽可能多的字符,并将匹配到外部结束标记。