如何循环所有与正则表达式匹配的元素?

DNB*_*ims 40 javascript regex

情况就是这样:我想找到与正则表达式匹配的元素......

targetText ="SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext"

我在这样的javascript中使用正则表达式

reg = new RegExp(/e(.*?)e/g);   
var result = reg.exec(targetText);
Run Code Online (Sandbox Code Playgroud)

而且我只获得第一个,但不是后续....我只能获得T1,但不能获得T2,T3 ......

cha*_*aos 68

var reg = /e(.*?)e/g;
var result;
while((result = reg.exec(targetText)) !== null) {
    doSomethingWith(result);
}
Run Code Online (Sandbox Code Playgroud)

  • 不要使用新的RegExp,然后插入正则表达式,只需执行`reg =/e(.*>)e/g;`使用new运算符是多余的,除非你给它一个字符串.还要确保使用全局标志(/ g)标记它,否则最终会出现无限循环. (13认同)
  • 请注意,在以这种方式使用之前必须将正则表达式赋值给对象:`/ e(.*?)e/.exec(...)`将给出无限循环. (5认同)
  • 您还可以缩短 while 表达式:`while(result = reg.exec(targetText)) {` 利用“false”解析。 (3认同)
  • @RaviParekh:你添加了`/g` 修饰符吗? (2认同)
  • 为了后代,RegExp 需要在 while 循环之外声明;否则你仍然会得到一个无限循环。 (2认同)
  • @Redtopia 如果您没有在正则表达式中使用“g”(全局)标志,则只能手动增加lastIndex(“reg.lastIndex = result.index + 1;”)。全局标志将自动移动到下一个匹配,但是,缺点是如果您想重新使用全局正则表达式,则必须在匹配新字符串之前重置“reg.lastIndex = 0;”。 (2认同)

bit*_*ess 15

三种方法取决于你想用它做什么:


tva*_*son 11

尝试在字符串而不是exec ()上使用match(),尽管你也可以使用exec循环.比赛应该一次性给你所有的比赛.我想你也可以省略全局说明符.

reg = new RegExp(/e(.*?)e/);   
var matches = targetText.match(reg);
Run Code Online (Sandbox Code Playgroud)

  • 不要链接到w3schools.它们与W3C无关,并且有很多错误的信息.见http://w3fools.com. (7认同)
  • @MindVirus - 如果你懒得检查,他们已经清理了很多w3fools.com指出的东西.我仍然将它们用作快速但非确定的资源.就像有人可能会使用K&R C上的备忘单来查找简单的东西. (4认同)
  • 不同之处在于你没有使用`String.match`获取捕获的组,而`RegExp.exec'则没有. (3认同)
  • “ String.prototype.match”的MDN参考-https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/match (2认同)