【问题标题】:Find every occurrence of a regex in a string查找字符串中出现的每个正则表达式
【发布时间】:2011-12-15 05:28:54
【问题描述】:

在阅读this postthis doc 之后,我正在尝试编写一个函数,该函数将返回字符串中正则表达式每次出现的索引(在本例中,每次出现一个数字)。我从上面链接的文档中获取了这个代码:

var myRe = /ab*/g;
var str = "abbcdefabh";
var myArray;
while ((myArray = myRe.exec(str)) != null)
{
  var msg = "Found " + myArray[0] + ".  ";
  msg += "Next match starts at " + myRe.lastIndex;
  print(msg);
}

把它变成了这样:

var myRe = /([0-9]*)/g;
var str = "gfarg h43kjh arjh 343";
var myArray;

while ((myArray = myRe.exec(str)) != null)
{
  var msg = "Found " + myArray[0] + ".  ";
  msg += "Next match starts at " + myRe.lastIndex;
  alert(msg);
}

这将无限循环显示相同的结果。我其实有两个问题。如何显示每个 whole 数字的索引(在我的示例字符串 "gfarg h43kjh arjh 343" 中为 7 和 18)。还有,为什么我当前的代码会无限循环?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    您的代码无限循环,因为您的正则表达式匹配空字符串。不要那样做:)。试试:

    var myRe = /([0-9]+)/g;
    

    这已经可以找到整数了。有关工作示例,请参阅 http://jsfiddle.net/nrabinowitz/3aHxS/1/

    【讨论】:

    • OK 只是一个快速的,如果正则表达式(上面的myRe)是我的函数将接收的参数怎么办。我应该如何预测它将永远循环并抛出异常?是通过检查 index 属性是否为 0 两次(我认为这意味着没有移动)还是有更简单的方法?
    • 好吧,作为安全措施,您可以设置一个计数器并检查while ((myArray = myRe.exec(str)) != null && myCounter < maxIterations)。然后,如果您愿意,可以在 myCounter == maxIterations 时在循环体内抛出错误。
    • ...虽然如果您只是想避免这个特殊问题,我认为您可以使用if (myRe.test('')) 进行测试,这将捕获与空字符串匹配的正则表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多