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

时间:2018-05-09 21:31:25

标签: javascript regex

尝试我之前的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 个答案:

答案 0 :(得分:4)

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