十年程序员难到了一个正则上面

2022-11-16 17:06:18 +08:00
 rekulas

非科班出身正则基础不够扎实

今天遇到一个匹配需求(1(2(,需要根据括号匹配到每一个数字,本来我以为很简单,但是始终只能匹配到 1 ,才发现这个的匹配值互相冲突了 (1(和(2(,根据我的理解匹配到 1 的时候索引已经移动到 2(了,要想匹配(2(就必须回溯一位,但是一般只有失败才回溯,这种成功了回溯的不清楚怎么写,试过 lookbehind 等方法貌似也不行

(别纠结为什么一定要用括号匹配而不是直接[\d]+,真实情况比这复杂这是演示数据,而且已经通过其他方式解决了,但我还是想知道这个怎么写正则)

1060 次点击
所在节点    程序员
5 条回复
aijam
2022-11-16 17:50:42 +08:00
每个 regex engine 实现不一样,比如 python 里面
(?=...) 是 lookahead
(?<=...) 是 lookbehind
所以你可以写 r"(?<=\()\d+(?=\()"
rekulas
2022-11-16 17:52:59 +08:00
@aijam 感谢了 666 那是我写错了
DrakeXiang
2022-11-16 22:12:59 +08:00
难道不是 /\((\d)/g 就行了么?
qeqv
2022-11-17 04:21:02 +08:00
```
const e = /\(\d\(/g;
let result
while((result=e.exec("(1(2(3(4"))!=null){
console.log(result[0]);
e.lastIndex--;
};
```
手动回溯😂
rekulas
2022-11-17 10:21:13 +08:00
@qeqv 可以 已经有分词器雏形了 🤣

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

https://tanronggui.xyz/t/895733

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

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

© 2021 V2EX