为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
开心每一天1111 2022-06-17 15:34:45
我尝试使用正则表达式(php)来匹配结尾的罗马数字。为简单起见,请考虑以下示例:$str="Olympic III";preg_match("#^(.*)(III|II|I)$#",$str,$rep);print_r($rep);那只会匹配一个“I”。正确的答案是我使用不贪婪的“U”修饰符。但为什么?正则表达式不使用我提供的顺序(在尝试“II”或“I”之前先尝试“III”)?
查看完整描述

3 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

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

您的正则表达式相当于(.*?)(III|II|I)没有 Ungreedy 标志,它您期望的一样匹配。

您实际上要求正则表达式引擎贪婪地使用(.*)(III|II|I)量词,即尽可能长时间地匹配任何内容。由于您的交替允许接受IIIIII,第一个捕获组,因为它是贪婪的,所以消耗最多,并将最小的部分留给包含交替的第二组。


查看完整回答
反对 回复 2022-06-17
?
千万里不及你

TA贡献1784条经验 获得超9个赞

尝试这个:


$str="Olympic III";

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

print_r($rep);


\sbefore (I+)or(III|II|I)匹配单个空格,它解决了您的问题,因为它强制正则表达式(.*)仅匹配有趣部分的开头。


查看完整回答
反对 回复 2022-06-17
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

.* 匹配 (III|II|I) 之前的最多字符,并且 (III|II|I) 只能匹配一个字符,您可以使用此正则表达式示例 ^(.*)\s(I+)$



查看完整回答
反对 回复 2022-06-17
  • 3 回答
  • 0 关注
  • 432 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号