【问题标题】:javascript regex match including non-capturing groupjavascript 正则表达式匹配,包括非捕获组
【发布时间】:2018-05-09 21:31:24
【问题描述】:

尝试我之前的 stackoverflow 问题 (Regex non-escaped quotation marks) 中的一个 cmets 导致了一个新问题:

var string = 'hello"ther';
string.match(/(?:[^\\])"/);
// ["o"", index: 4, input: "hello"ther", groups: undefined]

比赛包括"之前的o,即使该组有?:,我认为这使它无法捕获。

https://regex101.com/r/VCt1Ye/5

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    match 包括与 RegExp 匹配的整个字符串。 非捕获组只是意味着它不会被识别为一个组,它会出现在groups部分,但它仍然会出现在匹配的字符串中。

    换句话说,以下是捕获组的结果:

    var string = 'hello"ther';
    console.log(string.match(/([^\\])"/));
    // ["o\"","o"]
    

    这里,第一个元素是整个匹配的字符串(仍然相同,捕获或未捕获)。只是它还将“o”捕获为一个单独的组,这对于未捕获组来说是不正确的。


    您似乎正试图逃避非转义匹配。如果你想这样做,你可以这样做(使用捕获组):

    string = string.replace(/([^\\])(")/, '$1\\$2')
    

    其中第 1 组是 [^\\],第 2 组是 ",方法是在其前面添加一个斜线。


    为澄清而编辑:这些组的编号如下:

    • matches[0]:整个匹配组
    • matches[1]:第一个抓到的组
    • matches[2]:第二组抓获
    • ...

    判断是哪个组的一种简单方法是在组之前计算打开的捕获组括号。例如,下面正则表达式中的组($([\d,]+)

    /Total balance for (\w+): (($([\d,]+)\.(\d{2}))/
                       ^      ^^           ^
                       1      23           4
    

    matches[3],因为它是第三个左​​括号。

    【讨论】:

    • 哦,有道理。你是否知道如何找到捕获组的索引,而不是整个匹配的索引?
    • @junvar 索引是有序的(matches[0] 是整个匹配的字符串,matches[1] 是第一个捕获的组,matches[2] 是第二个捕获的组,等等。)一个简单的提示是计算组之前的左括号的数量以获得组号。我将在我的代码中添加一个示例。
    • @junvar 如果这个答案对您有帮助,请务必接受它以向社区展示它的帮助!
    • @mplungjan 我不确定你在问什么。你的意思是你只想捕获两个字母的代码?如果是这样,.match() 返回一个包含 complete 匹配项的数组(包括 :");我制作了this demo 来展示如何通过lookbehinds(实验性)和删除每个匹配的前两个字符来完成它。看起来您已经在回答中做了与后者类似的事情。另一种选择是使用.exec() 函数迭代匹配项,您可以使用match[1] 获取代码。
    • @mplungjan 我很高兴你找到了你要找的东西。不幸的是,browser support is limited,所以迭代元素可能仍然是目前最好的方法。
    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    相关资源
    最近更新 更多