正则表达式匹配结尾 III 或 II 或 I (php)

我尝试使用正则表达式(php)来匹配结尾的罗马数字。为简单起见,请考虑以下示例:


$str="Olympic III";

preg_match("#^(.*)(III|II|I)$#",$str,$rep);

print_r($rep);

那只会匹配一个“I”。正确的答案是我使用不贪婪的“U”修饰符。但为什么?正则表达式不使用我提供的顺序(在尝试“II”或“I”之前先尝试“III”)?


开心每一天1111
浏览 433回答 3
3回答

holdtom

让我们首先了解\U它在做什么。默认情况下,它使量词(在您的情况下,*在第一个捕获组中)变得懒惰。您的正则表达式相当于(.*?)(III|II|I)没有 Ungreedy 标志,它与您期望的一样匹配。您实际上要求正则表达式引擎贪婪地使用(.*)(III|II|I)量词,即尽可能长时间地匹配任何内容。由于您的交替允许接受III、II或I,第一个捕获组,因为它是贪婪的,所以消耗最多,并将最小的部分留给包含交替的第二组。

千万里不及你

尝试这个:$str="Olympic III";preg_match("#^(.*)\s(I+)$#",$str,$rep);print_r($rep);\sbefore (I+)or(III|II|I)匹配单个空格,它解决了您的问题,因为它强制正则表达式(.*)仅匹配有趣部分的开头。

汪汪一只猫

.* 匹配 (III|II|I) 之前的最多字符,并且 (III|II|I) 只能匹配一个字符,您可以使用此正则表达式示例 ^(.*)\s(I+)$
打开App,查看更多内容
随时随地看视频慕课网APP