JavaScript和正则表达式:获取带括号的子模式的数量

时间:2011-08-15 09:11:09

标签: javascript regex

我必须在正则表达式中获取带括号的子字符串匹配的数量:

var reg=/([A-Z]+?)(?:[a-z]*)(?:\([1-3]|[7-9]\))*([1-9]+)/g,
nbr=0;

//Some code

alert(nbr); //2

在上面的示例中,总数为2:只有第一个和最后一个括号将创建分组匹配。

如何知道任何正则表达式的这个数字?

我的第一个想法是检查RegExp。$ 1到RegExp。$ 9的值,但即使没有相应的parenthseses,这些值也不是null,而是空字符串......

我也看过RegExp.lastMatch属性,但是这个属性只代表最后匹配字符的值,而不是相应的数字。

所以,我试图构建另一个正则表达式来扫描任何RegExp并计算这个数字,但这很难......

你有更好的解决方案吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

Javascripts RegExp .match()方法返回一个匹配数组。您可能只想检查结果数组的长度。

var mystr = "Hello 42 world. This 11 is a string 105 with some 2 numbers 55";
var res = mystr.match(/\d+/g);

console.log( res.length );

答案 1 :(得分:1)

那么,从代码片段判断我们可以假设输入模式总是一个有效的正则表达式,因为否则它会在某些代码部分之前失败?这使得任务变得更加容易!

因为我们只需要计算开始捕获括号的数量!

var reg = /([A-Z]+?)(?:[a-z]*)(?:\([1-3]|[7-9]\))*([1-9]+)/g;

var nbr = (' '+reg.source).match(/[^\\](\\\\)*(?=\([^?])/g);
nbr = nbr ? nbr.length : 0;

alert(nbr); // 2

这是一个细分:

  • [^\\]确保我们不会以逃避斜线开始比赛。
  • (\\\\)*我们可以在起始括号之前有任意数量的转义斜杠。
  • (?=展望未来。稍后会详细介绍。
    • \(我们正在寻找的起始座位。
    • [^?]确保后面没有问号 - 这意味着它正在捕获。
  • )提前结束

为什么要与未来相匹配?要检查括号不是转义实体,我们需要捕获它前面的内容。这里没什么大不了的。我们知道JS没有看后面。

问题是,如果有两个起始括号粘在一起,那么一旦我们捕获第一个圆括号,第二个圆括号就没有任何东西可以支持它 - 它的后面已经被捕获了! 因此,为了确保括号可以作为下一个的起始基础,我们需要将其从匹配中排除。

这个空间加入了源头?它是第一个字符的后面,以防它是一个起始字符。