【问题标题】:Javascript Regex Expression Not Returning Expected ValueJavascript 正则表达式不返回预期值
【发布时间】:2018-03-29 13:25:09
【问题描述】:

我有一个 Javascript 迭代/正则表达式,这让我发疯了,希望有人能提供一些见解,因为我遇到的挑战似乎是 JS 所特有的。如您所见,我使用的正则表达式检查该字母是否在字符串中出现 2 次或更多次,如果没有则返回指定索引处的字母。但是,对于诸如“testing”之类的字符串,尽管“t”在字符串中存在两次,但它将返回“t”。然而,其他字符串,例如“aaaaac”,它将正确返回“c”。我已经在 Rubular 中对其进行了测试,并且 Regex 表达式工作正常,所以我无法确定为什么它在这种情况下不起作用。

function found (str) {
  for (const number in str) {
    let regex = new RegExp( str[number] + "{2,}");
    if (!str.match(regex)) {
      return str[number]
    }
  }
}

如果能提供任何见解,我将不胜感激!

【问题讨论】:

    标签: javascript regex algorithm iteration


    【解决方案1】:

    x{n,m} 正则表达式模式匹配 x 的序列。在“测试”这个词中,t 是分开的,模式不会匹配它们。

    使用全局 g 标志在数组中搜索所有出现的字母,然后将找到的匹配数与您的阈值 (2) 进行比较:

    function found (str) {
      for (const number in str) {
        const regex = new RegExp(str[number], 'g');
        const match = str.match(regex);
        if (!str.match(regex) || match.length < 2) {
          return str[number];
        }
      }
    }
    
    console.log(found('testing'));

    【讨论】:

      【解决方案2】:

      错误出现在您的正则表达式中,它只匹配连续字符,并且“aaaac”是一项特定的测试。所以要工作,只需改变它。

      function found (str) {
        for (const number in str) {
          let regex = new RegExp( str[number] + ".*" + str[number]);
          if (!str.match(regex)) {
            return str[number]
          }
        }
      }
      

      【讨论】:

        【解决方案3】:

        t{2,} 测试两个或更多紧邻t 实例。它匹配attackattttack,但不匹配testing,后者从不包含两个字符序列tt

        相反,您需要t.*t 形式的东西,它会测试t,后跟零个或多个字符,然后是另一个t。试试吧:

        new RegExp(str[number] + ".*" + str[number]);
        

        但是,请注意,您的代码有几个与此问题无关的相关属性:

        • 使用for-in 循环包括所有可枚举的属性,其中可能包含的不仅仅是字符串中字符的索引。如果库扩展 String.prototype 具有可枚举属性,它将包含在您的循环中,这可能会导致意外结果。选择从0str.length-1 的数字循环。

        • 您动态创建的正则表达式不会清理输入,如果测试正则表达式特殊字符(如 .*?)可能会导致问题。见Is there a RegExp.escape function in Javascript?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多