首页 文章

javascript正则表达式匹配包括非捕获组

提问于
浏览
1

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

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

该匹配包括 " 之前的 o ,即使该组具有 ?: ,我认为它是非捕获的 .

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

1 回答

  • 3

    匹配包括与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] 因为它是第三个左括号 .

相关问题