我必须在正则表达式中获取带括号的子字符串匹配的数量:
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的值,但是即使没有相应的括号,这些值也不是null,而是空字符串...
我也看到过RegExp.lastMatch属性,但是这个属性只表示最后一个匹配字符的值,而不是对应的数字。
因此,我尝试构建另一个正则表达式来扫描任何RegExp并计算这个数字,但这相当困难……
你有没有更好的解决方案呢?
提前感谢!
发布于 2011-08-16 00:14:10
那么,从代码片段判断,我们可以假设输入模式总是有效的正则表达式,因为否则它将在某些代码部分之前失败,对吧?这使得这项任务变得容易多了!
因为我们只需要计算一下有多少个开始捕获的括号!
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这是一个细目:
[^\\]确保我们不会以转义的slash.(\\\\)*开始匹配,并且在开始的parenthes.(?=之前,我们可以有任意数量的转义斜杠。稍后会对此进行更多说明。\(我们正在查找的起始括号for.[^?]确保后面没有问号-这意味着它是capturing.
) End of look ahead为什么要与展望未来相匹配?要检查括号不是转义的实体,我们需要捕获它之前的内容。这没什么大不了的。我们知道JS没有后顾之忧。
问题是,如果有两个开始的括号粘在一起,那么一旦我们捕获了第一个括号,第二个括号将没有任何支持-它的背面已经被捕获了!因此,为了确保括号可以作为下一个括号的开始基数,我们需要将其排除在匹配之外。
那么添加到源代码中的空间呢?它应该是第一个字符的后面,以防它是一个起始括号。
发布于 2011-08-15 17:18:09
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 );https://stackoverflow.com/questions/7063295
复制相似问题