确定字符串是否是回文

Cod*_*316 3 javascript regex string palindrome

我想知道我的逻辑在哪里有缺陷.将string(str)作为参数(字符串可以是小写,大写,逗号和句点)并设置为等于var string.然后它被反转,如果它等于原始字符串,则返回值为true.如果不相等false则显示返回值.为什么评价一切都是真的?

 function palindrome(str) {
     var string =str.toLowerCase().replace(/\s/g, '').replace(/,/g , '').replace(/./g , '');

     if (string==string.split("").reverse().join("")) {
         return true;
     }
     else{
         return false;
     }      
}

palindrome("nope");
Run Code Online (Sandbox Code Playgroud)

eli*_*ide 9

tl; dr.你的上一个正则表达式替换\.掉一个字符串.; 现在,你正在剥离所有角色.

问题

在正则表达式中,.匹配任何字符(新行除外\n,至少默认情况下).所以,这段代码替换了任何字符:

replace(/./g , '')
Run Code Online (Sandbox Code Playgroud)

结果,你正在清空字符串.空字符串的反向是一个空字符串,因此您总是得到返回值true.

解决方案

为了匹配文字时期,你必须.通过写作来逃避\..所以,将那部分改为

replace(/\./g , '')
Run Code Online (Sandbox Code Playgroud)

一些重构使您的代码更加令人敬畏

您也可以返回比较结果; 这里不需要if/ elseblock.这将使您的整个代码(格式化为可读性):

function palindrome(str) {
    var string =str.toLowerCase()
                    .replace(/\s/g, '')
                    .replace(/,/g , '')
                    .replace(/\./g , '');

    return string==string.split("").reverse().join("");
}

palindrome("nope");
Run Code Online (Sandbox Code Playgroud)

您可以更进一步,只删除所有非字母字符,这样您的代码可以更简单:

function palindrome(str) {
    var string =str.toLowerCase().replace(/[^a-z]/g, '');

    return string==string.split("").reverse().join("");
}

palindrome("nope");
Run Code Online (Sandbox Code Playgroud)