【问题标题】:non-capture group still showing in match非捕获组仍然显示在比赛中
【发布时间】:2013-08-12 01:59:44
【问题描述】:

我知道 StackOverflow 上已经全面介绍了这个主题,但我一辈子都无法让我的正则表达式正常工作。因此,无需进一步重复...


这就是我所拥有的。

字符串:<p model='cat'></p>

正则表达式:.match(/(?:model=')(.*)(?:')/g)

这是我的表达式返回的内容:model='cat'

这就是我想要的:cat


为什么我的非捕获组没有被忽略?是我不明白非捕获组是做什么的吗?为什么我的正则表达式不起作用?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    整个比赛总是第0组,你需要访问那个特定的组(在这种情况下是第1组,因为第一个组是非捕获的),你可以这样做:

    var str = "<p model='cat'></p>";
    var regex = /(?:model=')(.*)(?:')/g
    var match = regex.exec(str);
    alert(match[1]); // cat

    Fiddle

    另外,我想您可能想要在 str 中进行多个匹配,您可以这样做:

    var str = "<p model='cat'></p><p model='dog'></p><p model='horse'></p>";
    var regex = /(?:model=')([^']*)/g
    var matches = [];
    var match;
    while (match = regex.exec(str)) {
      matches.push(match[1]);
    }
    alert(matches); // cat,dog,horse

    Fiddle

    【讨论】:

    • 奇怪 .. 几乎就像你可以看到我输入的内容 .. 甚至型号名称都相同。谢谢!
    • 这将在没有任何非捕获的情况下工作,只需 /model='(.*)'/g 并匹配 match[1]
    • 对,通常没有理由创建非捕获组,除非您确实需要做需要组的事情
    【解决方案2】:

    非捕获组基本上只是一个非组——一种使用括号而不实际将模式的那部分视为一个组的方式。

    看起来您实际上要查找的是“匹配前缀但排除”组(?&lt;=) 和“匹配后缀但排除”组(?=)

    注意:Internet Explorer 似乎不支持这种类型的组。

    如果你使用这些,你会得到想要的结果:

    var str = "<p model='cat'></p><p model='dog'></p><p model='horse'></p>";
    var regex = /(?<=model=')[^']*(?=')/g
    var matches = str.match(regex);
    
    console.log(matches);

    【讨论】:

    猜你喜欢
    • 2021-08-24
    • 1970-01-01
    • 2017-11-08
    • 2010-10-21
    • 2021-09-24
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 2019-10-02
    相关资源
    最近更新 更多