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

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

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

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

我将非常感谢任何可以提供的见解

x{n,m}regex模式匹配x序列。在“测试”一词中,t是分开的,模式与它们不匹配

使用global
g
标志搜索数组中字母的所有外观,然后将找到的匹配数与阈值(2)进行比较:

找到函数(str){ for(str中的常量编号){ const regex=new RegExp(str[number],'g'); 常量匹配=str.match(regex); 如果(!str.match(regex)| match.length<2){ 返回str[number]; } } }
console.log(找到('testing'))x{n,m}regex模式匹配x序列。在“测试”一词中,t是分开的,模式与它们不匹配

使用global
g
标志搜索数组中字母的所有外观,然后将找到的匹配数与阈值(2)进行比较:

找到函数(str){ for(str中的常量编号){ const regex=new RegExp(str[number],'g'); 常量匹配=str.match(regex); 如果(!str.match(regex)| match.length<2){ 返回str[number]; } } }
console.log(找到('testing'))错误在正则表达式中,它只匹配连续字符,“aaaac”是一个特殊的测试。所以要想成功,就改变它

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

错误在正则表达式中,它只匹配连续字符,“aaaac”是一个特殊的测试。所以要想成功,就改变它

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

t{2,}
测试两个或多个紧邻的
t
实例。它匹配
攻击
攻击
,但不匹配
测试
,测试从不包含两个字符序列
tt

相反,您需要的是
t.*t
形式的内容,它测试
t
,后跟零个或多个字符,在某个点上后跟另一个
t
。请尝试:

new RegExp(str[number] + ".*" + str[number]);
但是,请注意,代码有几个与此问题无关的属性:

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

  • 动态创建的正则表达式不会清理输入,如果测试正则表达式特殊字符,如
    *
    ,可能会导致问题。看


t{2,}
测试两个或多个紧邻的
t
实例。它匹配
攻击
攻击
,但不匹配
测试
,测试从不包含两个字符序列
tt

相反,您需要的是
t.*t
形式的内容,它测试
t
,后跟零个或多个字符,在某个点上后跟另一个
t
。请尝试:

new RegExp(str[number] + ".*" + str[number]);
但是,请注意,代码有几个与此问题无关的属性:

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

  • 动态创建的正则表达式不会清理输入,如果测试正则表达式特殊字符,如
    *
    ,可能会导致问题。看