1
ch2 2021-04-20 21:23:50 +08:00
用.exec 而不是.match
|
2
renmu123 2021-04-20 21:25:57 +08:00 via Android
matchAll 试试看
|
3
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 |
4
maloneleo88 OP |
5
jinliming2 2021-04-20 23:00:16 +08:00 2
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 } |
6
maloneleo88 OP @jinliming2 十分感谢!
我用不了 matchAll 报错 1.7xxxx 巴拉巴拉, 应该是版本低吧 exec 还看不太明白,但大体意思我懂了。还有这里 result = reg.exec(res)的 reg 和 res 是不是应该反过来? // 处理 result 应该怎么处理呢? 新建一个数组把结果装进去嘛? |
7
jinliming2 2021-04-21 17:39:24 +08:00 via iPhone 1
@maloneleo88 没写反,这里的 reg 是正则对象,res 是要匹配的字符串,result 在循环里的每一次循环都存的是一个匹配结果,然后看你需要 result[1],result[2] 这样去用就行了。如果是要所有结果的话,那就 push 到数组里就行了
|
8
maloneleo88 OP @jinliming2 好的 明白了 👍
|