【问题标题】:How to loop all the elements that match the regex?如何循环匹配正则表达式的所有元素?
【发布时间】:2010-11-16 08:40:37
【问题描述】:

情况如下: 我想找到与正则表达式匹配的元素...

targetText = "SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext"

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

reg = new RegExp(/e(.*?)e/g);   
var result = reg.exec(targetText);

我只得到第一个,但没有得到后续.... 我只能拿到T1,不能拿到T2、T3……

【问题讨论】:

  • 谁能推荐一个for循环的方法来做?

标签: javascript regex


【解决方案1】:
var reg = /e(.*?)e/g;
var result;
while((result = reg.exec(targetText)) !== null) {
    doSomethingWith(result);
}

【讨论】:

  • 不要使用新的正则表达式,然后插入正则表达式,只需执行reg = /e(.*>)e/g; 除非你给它一个字符串,否则使用新的运算符是多余的。还要确保使用全局标志 (/g) 进行标记,否则可能会陷入无限循环。
  • 请注意,在以这种方式使用之前,必须将正则表达式分配给一个对象:/e(.*?)e/.exec(...) 将给出一个无限循环。
  • @RaviParekh:你添加了/g 修饰符吗?
  • 为了后代,RegExp 需要在 while 循环之外声明;否则你仍然会得到一个无限循环。
  • 您还可以缩短 while 表达式:while(result = reg.exec(targetText)) { 利用“false”解析。
【解决方案2】:

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

  • 遍历每场比赛:.match

    targetText.match(/e(.*?)e/g).forEach((element) => {
       // Do something with each element
    });
    
  • 循环并动态替换每个匹配项:.replace

    const newTargetText = targetText.replace(/e(.*?)e/g, (match, $1) => {
      // Return the replacement leveraging the parameters.
    });
    
  • 循环执行一些操作:.exec

    const regex = /e(.*?)e/g;  // Must be declared outside the while expression, 
                               // and must include the global "g" flag.
    
    let result;
    while(result = regex.exec(targetText)) {
      // Do something with result[0].
    } 
    

【讨论】:

  • 讽刺的是,我的 Lint 想在 while 表达式中用 == 代替 =
  • 为了让 eslint 接受单个 =,赋值可以用括号括起来,如下所示:while ((result = regex.exec(targetText)))
  • 在第二个例子中,是匹配关键字还是变量?如果它是一个变量,它持有什么?
  • @ColePerry match 是整个 RegExp 匹配,$1 是第一个捕获组 (),在该示例中,只有一个。
  • 这里,只有替换会起作用,因为在 Node.js 中,全局 match/exec 只返回不带组的完全匹配。
【解决方案3】:

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

reg = new RegExp(/e(.*?)e/);   
var matches = targetText.match(reg);

【讨论】:

  • 不要链接到 w3schools。他们与 W3C 无关,并且有很多错误信息。见w3fools.com
  • @MindVirus - 如果您愿意检查一下,他们已经清理了 w3fools.com 指出的许多内容。我仍然将它们用作快速但不是确定的资源。就像人们可以使用 K&R C 上的备忘单来查找一些简单的东西一样。
  • 作为一名中级开发人员,我已经在 w3schools 遇到过很多明显的错误。他们不在我的派对名单上。
  • String.prototype.match 的 MDN 参考 — developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
  • 不同之处在于String.match 不能获取捕获的组,而RegExp.exec 可以。
【解决方案4】:
targetText = "SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext"    
reg = new RegExp(/e(.*?)e/g);   
var result;
while (result = reg.exec(targetText))
{
    ...
}

【讨论】:

  • 它不起作用。在 JS 正则表达式中无法提取具有全局标志的组,因此用户只会收到完全匹配。
【解决方案5】:

在遵循上述建议时,我不断出现无限循环,例如:

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

每次分配给result的对象是:

["", "", index: 50, input: "target text", groups: undefined]

所以就我而言,我将上面的代码编辑为:

const reg = /e(.*?)e/g;
let result = reg.exec(targetText);
while(result[0] !== "") {
    doSomethingWith(result);
    result = reg.exec(targetText);
}

【讨论】:

  • 那是因为正则表达式。你已经让通过放一个问号来接受空字符串
【解决方案6】:

您也可以使用 String.replace 方法循环遍历所有元素。

result = [];
 // Just get all numbers
"SomeT1extSomeT2extSomeT3ext".replace(/(\d+?)/g, function(wholeMatch, num) {
  // act here or after the loop...
  console.log(result.push(num));
  return wholeMatch;
});
console.log(result); // ['1', '2', '3']

问候

【讨论】:

    【解决方案7】:

    我在控制台会话 (Chrome) 中执行此操作。

    > let reg = /[aeiou]/g;
    undefined
    > let text = "autoeciously";
    undefined
    > matches = text.matches(reg);
    (7) ["a", "u", "o", "e", "i", "o", "u"]
    > matches.forEach(x =>console.log(x));
    a
    u
    o
    e
    i
    o
    u
    

    【讨论】:

      【解决方案8】:

      我实际上正在处理这个问题。我更喜欢 Lambda 函数。

      reg = /e(.*?)e/gm;   
      var result = reg.exec(targetText);
      
      result.forEach(element => console.log(element));
      

      【讨论】:

      • 这只找到了第一个匹配项。
      猜你喜欢
      • 1970-01-01
      • 2011-08-11
      • 2018-03-07
      • 2021-03-06
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      相关资源
      最近更新 更多