V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
maloneleo88
V2EX  ›  JavaScript

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

  •  
  •   maloneleo88 · 2021-04-20 21:15:03 +08:00 · 1444 次点击
    这是一个创建于 1073 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 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 正则教程啥都没写
    8 条回复    2021-04-22 16:56:47 +08:00
    ch2
        1
    ch2  
       2021-04-20 21:23:50 +08:00
    用.exec 而不是.match
    renmu123
        2
    renmu123  
       2021-04-20 21:25:57 +08:00 via Android
    matchAll 试试看
    rbe
        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
    maloneleo88
        4
    maloneleo88  
    OP
       2021-04-20 22:45:12 +08:00 via Android
    @ch2
    @renmu123
    @rbe
    谢谢 我去学一下
    jinliming2
        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
    }
    maloneleo88
        6
    maloneleo88  
    OP
       2021-04-21 16:28:34 +08:00
    @jinliming2 十分感谢!

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

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

    // 处理 result 应该怎么处理呢? 新建一个数组把结果装进去嘛?
    jinliming2
        7
    jinliming2  
       2021-04-21 17:39:24 +08:00 via iPhone   ❤️ 1
    @maloneleo88 没写反,这里的 reg 是正则对象,res 是要匹配的字符串,result 在循环里的每一次循环都存的是一个匹配结果,然后看你需要 result[1],result[2] 这样去用就行了。如果是要所有结果的话,那就 push 到数组里就行了
    maloneleo88
        8
    maloneleo88  
    OP
       2021-04-22 16:56:47 +08:00 via Android
    @jinliming2 好的 明白了 👍
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1402 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 17:30 · PVG 01:30 · LAX 10:30 · JFK 13:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.