js 里的正则怎么像 Python 的 re 用()保留需要的字段?

2021-04-20 21:15:03 +08:00
 maloneleo88
在 python 里我用 re.findall(r"\d+,\d+,-1,'(.*?)',(\d+),(\d+),'(\d+)-(\d+)'",xxx)
直接可以拿到列表 [ [元组] [元组] ] 和()里的可用元素

在 js 里我用,
res.match(/\d+,\d+,-1,'(.*?)',(\d+),(\d+),'(\d+)-(\d+)'/);
不光括号里的拿到, 括号外的也拿到了,而且用 res[0][0]得不到一个元素,只能得到一个字符,怎么像 python 里 re.findall 那样方便的用在 js 里呢? 哪里有这样的教程呢? 菜鸟里面的 js 正则教程啥都没写
1472 次点击
所在节点    JavaScript
8 条回复
ch2
2021-04-20 21:23:50 +08:00
用.exec 而不是.match
renmu123
2021-04-20 21:25:57 +08:00
matchAll 试试看
rbe
2021-04-20 22:33:00 +08:00
js 教程一般在 mdn 找比较好。不会找的话平时搜索时候输入“关键词 mdn”比如“正则 mdn”一般跳出来第一个就是 mdn 页面。
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions
maloneleo88
2021-04-20 22:45:12 +08:00
@ch2
@renmu123
@rbe
谢谢 我去学一下
jinliming2
2021-04-20 23:00:16 +08:00
1. match 只返回匹配到的第一条结果,其中 [0] 为匹配到的整个字符串,[1] 为第一个括号捕获组,[2] 为第二个括号捕获组,以此类推。
2. js 的正则 /.../ 只能匹配第一个匹配结果,需要匹配所有结果的话,需要添加 g 标识:/.../g 。但是当你添加 g 标识之后,match 函数就只能返回所有匹配到的字符串了,而丢失了捕获组信息。
3. ES2020 新出了个 res.matchAll() 函数,返回一个迭代器,使用 [...res.matchAll(/.../g)] 即可得到和 python 的 findall 类似的结果,但是区别是 [0] 还是匹配到的整个字符串,[1] 才是第一个括号捕获组。但是更推荐的是使用 for (const m of res.matchAll(/.../g)) { ... } 去循环处理每一个匹配结果。
4. 如果执行环境较旧,没有 matchAll 函数的话。js 的正则是一个对象,内部会保存匹配进度信息。正则对象有一个 exec 方法。所以,可以这样来模拟 res.matchAll 的效果:

const reg = /.../g;
let result;
while (result = reg.exec(res)) {
// 处理 result
}
maloneleo88
2021-04-21 16:28:34 +08:00
@jinliming2 十分感谢!

我用不了 matchAll 报错 1.7xxxx 巴拉巴拉, 应该是版本低吧

exec 还看不太明白,但大体意思我懂了。还有这里 result = reg.exec(res)的 reg 和 res 是不是应该反过来?

// 处理 result 应该怎么处理呢? 新建一个数组把结果装进去嘛?
jinliming2
2021-04-21 17:39:24 +08:00
@maloneleo88 没写反,这里的 reg 是正则对象,res 是要匹配的字符串,result 在循环里的每一次循环都存的是一个匹配结果,然后看你需要 result[1],result[2] 这样去用就行了。如果是要所有结果的话,那就 push 到数组里就行了
maloneleo88
2021-04-22 16:56:47 +08:00
@jinliming2 好的 明白了 👍

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

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

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

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

© 2021 V2EX