我尝试使用正则表达式(php)匹配结尾的罗马数字。为简单起见,请考虑以下示例:
$str="Olympic III";
preg_match("#^(.*)(III|II|I)$#",$str,$rep);
print_r($rep);
只会匹配一个“ I”。正确的答案是使用不满意的“ U”修饰符。但为什么?正则表达式是否不使用我提供的顺序(尝试“ II”或“ I”之前先尝试“ III”)?
。*匹配(III | II | I)和(III | II | I)之前最多的字符,您可以使用此正则表达式样本^(。*)\ s(I +)$
让我们首先了解\U
在做什么。默认情况下,它会使量词(在您的情况下,第一个捕获组中的*
)变得懒惰。
您的正则表达式等效于不带有Ungreedy标志的(.*?)(III|II|I)
,正如您所期望的那样matches。
[(.*)(III|II|I)
您实际上要问的是正则表达式引擎是贪婪地使用量词,即,尽可能地匹配它们。由于您的替换允许接受III
,II
或I
,因此第一个捕获组由于行为贪婪,因此消耗最多,而为包含替换的第二个组保留了最小的部分。
尝试一下:
$str="Olympic III";
preg_match("#^(.*)\s(I+)$#",$str,$rep);
print_r($rep);
\s
或(I+)
匹配单个空格之前的[(III|II|I)
,它解决了您的问题,因为它强制regexp匹配(.*)
仅在感兴趣的部分开始。