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



尝试我之前堆栈溢出问题中的一个评论(正则表达式非转义引号(导致了一个新问题:

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

这场比赛包括"前的o,尽管小组有我认为没有捕获的?:

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

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

最新更新