我必须在正则表达式中获取带括号的子字符串匹配的数量:
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并计算这个数字,但这很难......
你有更好的解决方案吗?
提前致谢!
答案 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没有看后面。
问题是,如果有两个起始括号粘在一起,那么一旦我们捕获第一个圆括号,第二个圆括号就没有任何东西可以支持它 - 它的后面已经被捕获了! 因此,为了确保括号可以作为下一个的起始基础,我们需要将其从匹配中排除。
这个空间加入了源头?它是第一个字符的后面,以防它是一个起始字符。