加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 带有命名子模式的正则表达式看不到最佳匹配

发布时间:2020-12-14 05:57:15 所属栏目:百科 来源:网络整理
导读:在reg exp中使用已定义的子模式时,它不会选择最佳匹配,而是在第一次匹配时停止.我忘记了一些国旗吗? 正则表达式:(α min [0-9] | [1-5] [0-9]):(α分钟); 测试字符串:47:24;. 表达式不匹配: 但是字符串47:2;匹配正确: . 如果我将’或’条件改为[1-5]
在reg exp中使用已定义的子模式时,它不会选择最佳匹配,而是在第一次匹配时停止.我忘记了一些国旗吗?

正则表达式:(α< min> [0-9] | [1-5] [0-9]):(α&分钟);
测试字符串:47:24;.

表达式不匹配:

但是字符串47:2;匹配正确:

.

如果我将’或’条件改为[1-5] [0-9] | [0-9],则reg exp(?< minutes> [1-5] [0-9] | [0-9]) :;(&安培;分钟?)工作得很好.有没有其他方法可以使字符串’47:24;’匹配而不反转’或’条件?

解决方法

使用PCRE,递归组是原子的(参见本 article).这就是正则表达式引擎无法回溯(?& minutes)的原因.

在42:24;中,24中的2与第一个分支[0-9]匹配(自第一次获胜以来),但是当模式失败时,因为字符串中有4而不是;,正则表达式引擎可以在(?& minutes)子模式中回溯以测试第二个分支[1-5] [0-9]. (你可以看看debugger)

解决方案:不要对如此小的子模式使用递归,它是无用的,没有意义(特别是如果你使用捕获组的名称).写点像:

(?<minutes>[1-5]?[0-9]):(?<seconds>[1-5]?[0-9]);

或者为什么不:

(?(DEFINE)(?<sex>[1-5]?[0-9]) for "sexagesimal",not for what you think)
(?<minutes>(?&sex)):(?<seconds>(?&sex));

看起来多余,但有意义,如果你想提取分钟和秒钟(或者根本不使用组),这是有用的.毕竟,如果你使用命名捕获,你的目标不是写出世界上最短的模式.

如果你无法避免交替:

>你可以把最长的分支放在第一位:[1-5] [0-9] | [0-9]按照卢卡斯的建议.
>你也可以使用互斥的分支:[1-5] [0-9]?| [06-9],[06-9] | [1-5] [0-9]? (在这种情况下,订单无关紧要)

请注意,递归组的这种行为特别适用于PCRE,它与Perl或Ruby不同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读