试了 php 和 ruby
匹配字符串 ABCD
加了^$ 匹配到的是 CD
不加是 AB
什么原因啊 不是都该返回 AB 因为懒惰匹配?
1
itskingname 2023-08-07 11:08:19 +08:00
在 Python 中,不加时能同时得到 AB 和 CD ,加了只有 CD
``` >>> import re >>> re.findall('(AB|CD)+?', 'ABCD') ['AB', 'CD'] >>> re.findall('^(AB|CD)+?$', 'ABCD') ['CD'] ``` |
2
corningsun 2023-08-07 11:22:24 +08:00
^ 的意思是要求被匹配的字符串,必须是字符串开头
^(AB|CD)+?$ 对 CDXXX 就可以匹配到 CD 了。 |
3
qwq11 2023-08-07 11:30:31 +08:00 via Android
我觉得应该 AB 和 CD 都被找到才是对的,测试了发现只有.net 是两个都找到了
|
4
x77 2023-08-07 12:12:40 +08:00 via Android 1
正则表达式语言真的是个非常糟糕的设计,这玩意就是给机器看的,与人类文化格格不入,完全不考虑使用成本和体验
|
5
glouhao 2023-08-07 14:20:01 +08:00
原来各种语言解释还是不一样的
|
6
Rache1 2023-08-07 15:27:30 +08:00
个人理解是他还要满足 `\$` 的情况,所以最终拿到的是 CD 。
|
7
NoOneNoBody 2023-08-07 17:00:42 +08:00
有意思的话题
我只知道这个涉及“正则回溯”的原理,不过我还不怎么理解这个原理 大致意思就是当正则遇到不能满足的匹配(整字符串)时,则向前回溯找可匹配的部分 回溯还有优先级和是否贪婪的因素在内 反正我脑子不好使,看了不少文章都没弄明白 |
8
NoOneNoBody 2023-08-07 17:11:14 +08:00
这个按回溯的理解步骤是
1.(AB|CD)-->AB 成功 2.^AB 成功,-->AB 3.向右 AB$,不成功 4.回溯最后成功的 2 ,另外选择-->CD 5.向右 CD$成功 问题就是第 4 步应该回溯到 2 还是回溯到 1 ,回溯到 1 的话,应该没有结果,因为^CD 也是不成功的 尤其,这个在不同语言表现有区别,这就让我越看越糊涂了 |
10
L0L 2023-08-07 21:33:01 +08:00
感觉是 $ 起了作用,要匹配到结束符;^(AB|CD)+? 就只会匹配到 AB
|