相同单词的正则表达式首先显示为假,然后为真

时间:2017-01-22 19:42:45

标签: javascript regex

我在使用正则表达式测试字符串时遇到问题。 迭代后“aab”,“aab”,“aba”..这里出现了问题,当测试字符串“baa”第一次没问题时,结果是假的,因为正则表达式测试设置为检查字符串中是否有重复的字母,但是在测试时再次“咩”的结果现在是真的。为什么会这样?

以下是代码:

//Here are function for swaping letters         
String.prototype.swapLetters=function(index) {
        var temp = this.split("");
        var n = temp[index];
        temp[index]=temp[index+1]; temp[index+1]=n;
        var str1 = temp.join("");
        return str1;
    }



 function permAlone(str) {
//the function for calculating number of total combinations
        function returnFactorial(num){
            if(num===0){
                return 1;
            } else {
                return returnFactorial(num-1)*num;
            }
        }
        var combs = returnFactorial(str.length);
        var c = 0;
        var permutations = 0;
        var reg = new RegExp(/(.)\1+/g);
        for (var i = 0; i < combs; i++) {
            if(c>=str.length-1){
                c = 0;
            } 
            str = str.swapLetters(c);
            if(!reg.test(str)){
                permutations++;
                console.log(str);
            }

            c++;
        }
    }
permAlone('aab');

1 个答案:

答案 0 :(得分:0)

首先,如果您打算识别正则表达式匹配,则if(!reg.test(str)){}的条件不应该包含!(不)。不过,我不确定这是不是你想要的。

其次,我删除了'全局'匹配标志'g',以便正则表达式基本上“重置”,以便在每次执行之前从文本的开头开始匹配。这是因为多次执行单个RegExp对象时,每次从最后一个匹配索引开始匹配文本。这可以为您提供详细的解释。 Why RegExp with global flag in Javascript give wrong results?

试试这个。

//Here are function for swaping letters         
String.prototype.swapLetters=function(index) {
        var temp = this.split("");
        var n = temp[index];
        temp[index]=temp[index+1]; temp[index+1]=n;
        var str1 = temp.join("");
        return str1;
    }

function permAlone(str) {
//the function for calculating number of total combinations
        function returnFactorial(num){
            if(num===0){
                return 1;
            } else {
                return returnFactorial(num-1)*num;
            }
        }
  
        var combs = returnFactorial(str.length);
        var c = 0;
        var permutations = 0;
        var reg = new RegExp(/(\w)\1+/);
        for (var i = 0; i < combs; i++) {
            if(c>=str.length-1){
                c = 0;
            } 
            str = str.swapLetters(c);
            console.log("case : " + str);
            if(reg.test(str)){
                permutations++;
                console.log(str + " has repeated letters");
            }

            c++;
        }
    }
permAlone('aab');