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