【发布时间】:2014-03-10 14:15:44
【问题描述】:
我在匹配正则表达式中的 optional 模式组时遇到问题。 元字符 * 和 + 是贪婪的,所以我认为元字符?也会很贪心,但它似乎不像我想的那样运作。
理论上我假设如果我们选择使模式组可选,如果模式组在字符串中找到,它将在匹配结果中返回,如果没有找到我们仍将获得整体匹配结果,但结果中缺少此匹配项。
实际发生的情况是,如果我的模式在字符串中匹配,它不包含在匹配结果中,正则表达式似乎注意到模式组是可选的,甚至不费心去尝试匹配它。
如果我们设置一个测试并将这个可选模式组更改为非可选,正则表达式会将其包含在匹配结果中,但这仅适用于测试,因为有时该模式在字符串中不可用。
我之所以需要将匹配结果包含在结果中,是因为我需要匹配结果以供日后分析。
Encase 我没有很好地描述这个场景,我在 PHP 中设置了一个非常简单的示例。
$string = 'This is a test, Stackoverflow. 2014 Cecili0n';
if(preg_match_all("~(This).*?(Stackoverflow)?~i",$string,$match))
print_r($match);
结果
Array
(
[0] => Array
(
[0] => This
)
[1] => Array
(
[0] => This
)
[2] => Array
(
[0] =>
)
)
(Stackoverflow)? 是可选模式,如果我们运行上面的代码,即使该模式在字符串中可用,它也不会在匹配结果中返回。
如果我们将此模式组设为强制性,它将在结果中返回,如下所示。
if(preg_match_all("~(This).*?(Stackoverflow)~i",$string,$match))
print_r($match);
结果
Array
(
[0] => Array
(
[0] => This
)
[1] => Array
(
[0] => This
)
[2] => Array
(
[0] => Stackoverflow
)
)
我怎样才能做到这一点?获得有关如何找到匹配项的准确数据对我来说很重要。
感谢您对此事的任何想法。
【问题讨论】:
-
哇,非常好的问题。我完全感到困惑,也想知道这里实际发生了什么。注意:这不是 PHP 特有的问题,而是一般的 RegEx 问题。
-
@tenub 我过去遇到过这个问题,并花了几个小时尝试许多不同的替代方案,例如更深的嵌套子组、指定最小间隔组等等,最后我相信我只是把它遗漏了,现在问题又回来了,但这次我不能离开它。