在看正则表达式,有个简单的问题想请教各位

2012-07-02 23:11:47 +08:00
 codeplay
\w8
去匹配888,按我的理解有两个才对(第一个第二个8,第二个第三个8),为什么我使用在线的regexpal.com/结果只有一个呢?
3548 次点击
所在节点    程序员
3 条回复
khotyn
2012-07-02 23:38:01 +08:00
第二个匹配应该在第一个匹配结果的后面开始,因为第一次匹配完了以后只剩下一个 8 了,所以匹配不上,所以只有一个结果。
nani
2012-07-07 23:24:51 +08:00
不严紧,应该是这样吧 \w8{3}
013231
2012-07-08 01:45:39 +08:00
想匹配2次你应该写成
(?=\w8).
你可以这么理解: 一般的匹配会把已匹配到的部分消耗掉. /\w8/匹配了888中的前2个8, 它们被消耗掉了; 剩下的一个8自然无法和/\w8/匹配.
然而(?=pattern)是所谓的"正向肯定预查", 它的作用是"匹配, 但不消耗". /(?=\w8)/匹配了前2个8, 但并没把它们消耗掉. 不过只用/(?=\w8)/是不行的, 由于不消耗字符, 它只能无限在原地匹配, 所以在后面加一个'.', 消耗一个字符, 使匹配起点右移一位.

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

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

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

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

© 2021 V2EX