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

问题描述 投票:1回答:3

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

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

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

php regex preg-match
3个回答
0
投票

。*匹配(III | II | I)和(III | II | I)之前最多的字符,您可以使用此正则表达式样本^(。*)\ s(I +)$


0
投票

让我们首先了解\U在做什么。默认情况下,它会使量词(在您的情况下,第一个捕获组中的*)变得懒惰。

您的正则表达式等效于不带有Ungreedy标志的(.*?)(III|II|I),正如您所期望的那样matches

[(.*)(III|II|I)您实际上要问的是正则表达式引擎是贪婪地使用量词,即,尽可能地匹配它们。由于您的替换允许接受IIIIII,因此第一个捕获组由于行为贪婪,因此消耗最多,而为包含替换的第二个组保留了最小的部分。


0
投票

尝试一下:

$str="Olympic III";
preg_match("#^(.*)\s(I+)$#",$str,$rep);
print_r($rep);

PHP Sandbox

\s(I+)匹配单个空格之前的[(III|II|I),它解决了您的问题,因为它强制regexp匹配(.*)仅在感兴趣的部分开始。

© www.soinside.com 2019 - 2024. All rights reserved.