Javascript 重复字母false和true的正则表达式?

Javascript 重复字母false和true的正则表达式?,javascript,regex,Javascript,Regex,我有一个字符串数组,我正在尝试筛选包含重复字母的字符串数组。然而,有两件奇怪的事情正在发生,我不明白。这是我的密码: var array = ["aba", "aab", "baa"]; var pattern = /(\D)\1+/gi; var filteredArr = array.filter(function(element){ console.log(element); console.log(pattern.test(element)); return

我有一个字符串数组,我正在尝试筛选包含重复字母的字符串数组。然而,有两件奇怪的事情正在发生,我不明白。这是我的密码:

var array = ["aba", "aab", "baa"];

var pattern = /(\D)\1+/gi;

var filteredArr = array.filter(function(element){
    console.log(element);
    console.log(pattern.test(element));
    return pattern.test(element) != true;
});

console.log(filteredArr);
有些奇怪的事情发生了。在filter函数中,我测试正则表达式是真是假,这是应该的

pattern.test("aba") = false;
pattern.test("aab") = true;
pattern.test("baa") = true;
然而,如果我在函数之外测试它们,“baa”似乎返回false…这很奇怪,对吗

console.log(pattern.test("aba")); //returns false
console.log(pattern.test("aab")); //returns true
console.log(pattern.test("baa")); //returns false
下一个奇怪的事情。filter函数应返回未通过(即返回false)过滤器测试的元素。我的预期产出是:

filteredArr = ["aba"];
filteredArr = ["aab", "baa"];
但是,按照代码的方式,我的输出是:

filteredArr = ["aba", "aab", "baa"];
更奇怪的是,如果我更改filter函数以返回通过测试的元素(即返回true),预期的输出将是:

filteredArr = ["aba"];
filteredArr = ["aab", "baa"];
但是,我收到的输出是一个空数组:

filteredArr = [];
我非常困惑。我的正则表达式是否错误,或者我是否尝试了筛选函数无法完成的操作?下面是对所有代码的修改:


您看到的奇怪行为是
g
修饰符的结果。对
test
的每次调用都会推进模式的
lastIndex
属性,从而使对
test()
的下一次调用在字符串中的稍后点开始

以下是:

仅当正则表达式实例使用 “g”标志表示全局搜索。以下规则适用:

  • 如果
    lastIndex
    大于字符串长度,
    test()
    exec()
    失败,则
    lastIndex
    设置为
    0
  • 如果
    lastIndex
    等于字符串的长度,并且如果正则表达式与空字符串匹配,则正则表达式 匹配从
    lastIndex
    开始的输入
  • 如果
    lastIndex
    等于字符串的长度,并且如果正则表达式与空字符串不匹配,则正则表达式 表达式与输入不匹配,
    lastIndex
    被重置为
    0
  • 否则,
    lastIndex
    将设置到最近匹配后的下一个位置
您可以通过添加
console.log(pattern.lastIndex)来验证这一点到您的
过滤器

var数组=[“aba”、“aab”、“baa”];
var模式=/(\D)\1+/gi;
var filteredar=array.filter(函数(元素){
var测试=模式测试(元素);
console.log(元素+”:“+测试);
log(pattern.lastIndex);
回归试验;
});

控制台日志(Filteredar)
您正在将全局regexp与
.test
一起使用,这是有问题的

考虑以下开发人员控制台跟踪

$ var pattern = /(\D)\1+/gi;
undefined
$ pattern.lastIndex
0
$ pattern.test('xx')
true
$ pattern.lastIndex
2
$ pattern.test('xx')
false
$ pattern.lastIndex
0
您遇到的问题是带有
g
标志的
RegExp
s在
lastIndex
恢复检查,因此如果您连续检查同一字符串两次,您会得到不同的结果


您可以手动重置
pattern.lastIndex=0
或使用非全局
RegExp

这是一个工作示例

var数组=[“aba”、“aab”、“baa”、“bba”、“bab”];
var filteredar=array.filter(函数(元素){
控制台日志(元素);
//请注意,使用的是常量而不是var
变量t=/(\D)\1+?/gi.test(元素);
控制台日志(t);
返回!t;
});

控制台日志(Filteredar)请在发布新问题之前进行一些研究。删除
g
标志。