V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
guxianbang
V2EX  ›  程序员

如何用正则表达式匹配第二个引号里的内容?

  •  
  •   guxianbang · 2019-06-20 11:13:45 +08:00 · 6272 次点击
    这是一个创建于 2018 天前的主题,其中的信息可能已经有所发展或是发生改变。

    当一个句子中有多对引号的时候,例如:

    Last "week" I "went" to the "theatre"

    正则表达式"[^"]+"只能匹配最后一个引号里的内容:theatre

    我想匹配第二个引号里的内容( went ),该怎么写规则呢?

    18 条回复    2019-06-20 17:01:20 +08:00
    choury
        1
    choury  
       2019-06-20 11:17:35 +08:00 via Android
    多匹配点,然后别的不捕获
    mooncakejs
        2
    mooncakejs  
       2019-06-20 11:22:21 +08:00
    'Last "week" I "went" to the "theatre"'.match(/"\w+"/g)
    guxianbang
        3
    guxianbang  
    OP
       2019-06-20 11:31:25 +08:00
    @mooncakejs 匹配不到
    clarkyi
        4
    clarkyi  
       2019-06-20 11:39:49 +08:00
    "\w+"$
    clarkyi
        5
    clarkyi  
       2019-06-20 11:40:34 +08:00
    @clarkyi 这一条也不行
    mooncakejs
        6
    mooncakejs  
       2019-06-20 11:42:17 +08:00
    @guxianbang 这是全匹配出来,找最后一个就好了。
    只要最后一个就 'Last "week" I "went" to the "theatre"'.match(/"\w+"$/)
    opticaline
        7
    opticaline  
       2019-06-20 11:44:02 +08:00

    ```
    var re = /"[^"]+"/g;
    var s = 'Last "week" I "went" to the "theatre"';
    var m;

    do {
    m = re.exec(s);
    if (m) {
    console.log(m[0]);
    }
    } while (m);
    ```
    loryyang
        8
    loryyang  
       2019-06-20 11:44:34 +08:00
    re.match(r'[^"]*"[^"]*"[^"]*"([^"]*)".*', 'Last "week" I "went" to the "theatre"').group(1)
    得到 went
    opticaline
        9
    opticaline  
       2019-06-20 11:45:25 +08:00
    @guxianbang 我觉得不是正则的问题,是你获取的不对
    guxianbang
        10
    guxianbang  
    OP
       2019-06-20 11:59:20 +08:00
    谢谢各位🙏,我研究一下
    pkookp8
        11
    pkookp8  
       2019-06-20 12:21:31 +08:00 via Android
    ^.*?".*?".*?"(.*?)"
    \1
    ahaodady
        12
    ahaodady  
       2019-06-20 13:16:18 +08:00
    解题问问,突然想到的一个问题
    ahaodady
        13
    ahaodady  
       2019-06-20 13:17:15 +08:00
    12345

    使用 \d{2}
    只能取到 12、34
    我怎么取 23、45 呢
    ahaodady
        14
    ahaodady  
       2019-06-20 13:21:28 +08:00
    顺便回答题主,你的正则会取出所有引号里的内容,如果确定是最后一项的话,在代码里取最后一条即可。

    如果是编辑器里的话,结尾带个$

    "([^"]+)"$
    azh7138m
        15
    azh7138m  
       2019-06-20 13:24:55 +08:00
    零宽断言?
    ^.*?(?<=".*?").*?"(.*?)"
    先匹配一个"",然后取后面这个""
    zhzbql
        16
    zhzbql  
       2019-06-20 14:58:57 +08:00
    js 解法
    /^.*?".*?".*?"(.*?)"/.exec('Last "week" I "went" to the "theatre"')[1]
    或 'Last "week" I "went" to the "theatre"'.match(/".*?"/g)[1]
    hjq98765
        17
    hjq98765  
       2019-06-20 15:23:55 +08:00
    @ahaodady 零宽断言

    以 python 为例:

    import re
    re.findall('(?=(\d{2}))','12345')
    # ['12', '23', '34', '45']
    ismyyym
        18
    ismyyym  
       2019-06-20 17:01:20 +08:00
    python:

    import re

    str='Last "week" I "went" to the "theatre"'

    x=re.search('^.*?".*?".*?"(.*?)"',str ).group(1) #正数第二个”“

    y=re.search('.*"(.*?)".*?".*?".*?$',str ).group(1) #倒数第二个”“

    z=re.findall('"(.*?)"',str)[1] # 返回所有”“,取第二个


    用对下面这些
    ^ $ *?
    开头 结尾 尽可能少
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2821 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:19 · PVG 21:19 · LAX 05:19 · JFK 08:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.