首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript和正则表达式:获取带括号的子模式的数量

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

Stack Overflow用户
提问于 2011-08-15 17:11:09
回答 2查看 367关注 0票数 0

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

代码语言:javascript
复制
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并计算这个数字,但这相当困难……

你有没有更好的解决方案呢?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-16 00:14:10

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

因为我们只需要计算一下有多少个开始捕获的括号!

代码语言:javascript
复制
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没有后顾之忧。

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

那么添加到源代码中的空间呢?它应该是第一个字符的后面,以防它是一个起始括号。

票数 1
EN

Stack Overflow用户

发布于 2011-08-15 17:18:09

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

代码语言:javascript
复制
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 );
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7063295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档