Javascript全局匹配与捕获组[重复]

Posted

技术标签:

【中文标题】Javascript全局匹配与捕获组[重复]【英文标题】:Javascript global match with capturing groups [duplicate] 【发布时间】:2016-12-17 18:39:56 【问题描述】:

谁能告诉我为什么第二个 sn-p 在使用 g 标志时没有捕获“组”?

  "123".match(/(\d1)(\d1)/)    // returns  ["12", "1", "2"]
  "123".match(/(\d1)(\d1)/g)   // returns ["12"]   (where's 1 and 2 ?)

console.log("123".match(/(\d1)(\d1)/))    // returns  ["12", "1", "2"]

console.log("123".match(/(\d1)(\d1)/g))   // returns ["12"]   (where's 1 and 2 ?)

【问题讨论】:

捕获组在匹配方法developer.mozilla.org/en/docs/Web/javascript/Reference/…中不包含全局修饰符@ \d1 ===> (\d) 【参考方案1】:

根据MDN docs:

如果正则表达式不包含 g 标志,则返回与 RegExp.exec() 相同的结果。返回的 Array 有一个额外的输入属性,其中包含已解析的原始字符串。另外,它还有一个index属性,表示匹配在字符串中从零开始的索引。

如果正则表达式包含 g 标志,则该方法返回一个包含所有匹配子字符串而不是匹配对象的数组。不返回捕获的组。如果没有匹配项,则该方法返回 null。


如果要获取捕获组并设置了全局标志,则需要使用RegExp.exec()。

var myRe = /(\d)(\d)/g;
var str = '12 34';
var myArray;
while (myArray = myRe.exec(str)) 
  console.log(myArray);

【讨论】:

请注意,需要将正则表达式定义为变量才能使其工作。否则你会以无限循环结束(例如while (myArray = /(\d)(\d)/g.exec(str)))。

以上是关于Javascript全局匹配与捕获组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 正则表达式全局匹配组

正则表达式:如何在捕获单个组时匹配整个字符串 [重复]

c# 正则表达式捕获

[javascript] 获取正则子表达式里的内容

JavaScript正则常用知识总结

JS:将条目与捕获组匹配,占新行