尝试我之前的stackoverflow问题(Regex non-escaped quotation marks)中的一条评论导致了一个新问题:
var string = 'hello"ther';
string.match(/(?:[^\\])"/);
// ["o"", index: 4, input: "hello"ther", groups: undefined]
匹配包括o
之前的"
,即使该群组中有?:
我认为它不会被捕获。
答案 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]
,因为它是第三个左括号。