一般(即不包括任何特定于整个模式的文字)PCRE子表达式放在两个子表达式之间,每个子表达式由文字字符组成,这将导致模式匹配最小数量的字符?
请注意,以下问题不符合此问题:
this related question的任何现有答案。
我在本网站上发现的其他相关问题的任何现有答案,包括可能已经有您答案的问题建议的所有问题。
.*?
(懒惰)。这(如所述here)不一定与最小数量的字符匹配。
[^x]*
其中x是从模式中的其他位置复制的文字字符。要求是一般表达式,即不包括整个模式特有的任何文字。为了避免吸引这样的错误答案,这个问题故意不提供失败模式的例子。
答案 0 :(得分:2)
此正则表达式找到以left
开头并以right
结尾的最短匹配,并允许其间的任何文字:
(left)(?:(?!(?1)).)*?(?:right)
此正则表达式适用于PCRE和支持subroutine calls的任何其他风格。 left
和right
位不必是文字文本。它们可以是任何正则表达式,只要它们与相同的文本不匹配即可。您需要考虑的唯一其他问题是,如果left
和right
包含捕获组,那么与left
和right
相比,这些组的数量将会转移为独立的正则表达式。
回溯正则表达式引擎总是返回最左边的匹配。在left
和right
不同的情况下,我们可以通过确保匹配不多次包含left
来强制它返回最短匹配。
当left
和right
相同时,没有纯正则表达式解决方案。然后你可以做的是沿left
的所有匹配分割字符串,然后在结果数组中找到最短的字符串。