正则表达式 (AB|CD)+? 与 ^(AB|CD)+?$的区别

2023-08-07 10:44:52 +08:00
 zzzkkk

试了 php 和 ruby

匹配字符串 ABCD

加了^$ 匹配到的是 CD

不加是 AB

什么原因啊 不是都该返回 AB 因为懒惰匹配?

1007 次点击
所在节点    问与答
10 条回复
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']
```
corningsun
2023-08-07 11:22:24 +08:00
^ 的意思是要求被匹配的字符串,必须是字符串开头

^(AB|CD)+?$ 对 CDXXX 就可以匹配到 CD 了。
qwq11
2023-08-07 11:30:31 +08:00
我觉得应该 AB 和 CD 都被找到才是对的,测试了发现只有.net 是两个都找到了
x77
2023-08-07 12:12:40 +08:00
正则表达式语言真的是个非常糟糕的设计,这玩意就是给机器看的,与人类文化格格不入,完全不考虑使用成本和体验
glouhao
2023-08-07 14:20:01 +08:00
原来各种语言解释还是不一样的
Rache1
2023-08-07 15:27:30 +08:00
个人理解是他还要满足 `\$` 的情况,所以最终拿到的是 CD 。
NoOneNoBody
2023-08-07 17:00:42 +08:00
有意思的话题

我只知道这个涉及“正则回溯”的原理,不过我还不怎么理解这个原理
大致意思就是当正则遇到不能满足的匹配(整字符串)时,则向前回溯找可匹配的部分
回溯还有优先级和是否贪婪的因素在内
反正我脑子不好使,看了不少文章都没弄明白
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 也是不成功的
尤其,这个在不同语言表现有区别,这就让我越看越糊涂了
DianAvA
2023-08-07 17:18:47 +08:00
@x77 确实难看又难用,还好现在可以交给 ChatGPT 生成
L0L
2023-08-07 21:33:01 +08:00
感觉是 $ 起了作用,要匹配到结束符;^(AB|CD)+? 就只会匹配到 AB

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/962959

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX