Javascript正则表达式未返回预期值

时间:2017-10-17 18:46:36

标签: javascript regex algorithm iteration

我有一个Javascript迭代/正则表达式,这让我疯狂,并希望有人可以提供一些见解,因为我遇到的挑战似乎是JS特有的东西。正如您所看到的,我检查了正则表达式,以查看字母在字符串中是否出现2次或更多次,如果它没有,则返回指定索引处的字母。但是,对于诸如"测试"之类的字符串它将返回" 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]
    }
  }
}

我非常感谢能够提供的任何见解!

3 个答案:

答案 0 :(得分:1)

x{n,m}正则表达式模式匹配x的序列。在单词" testing"中,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'));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

错误在你的正则表达式中,它只匹配连续的字符,而“aaaac”是一个特定的测试。所以要做好工作,只需改变它。

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

答案 2 :(得分:1)

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

相反,您需要t形式的某些内容,它会测试t,后跟零个或多个字符,然后在某个时刻再测试另一个new RegExp(str[number] + ".*" + str[number]); 。请尝试改为:

for

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

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

  • 动态创建的正则表达式不会清理输入,如果测试正则表达式特殊字符(如*?<tr class="row" *ngFor="let pipline of piplines | datafilter: {Status:searchText}"> ,则会导致问题。请参阅Is there a RegExp.escape function in Javascript?