判断一个字符串是否为回文串

3

我想知道我的逻辑哪里出了问题。一个字符串(str)被作为参数(该字符串可以是小写字母、大写字母以及包含逗号和句号的混合)并被赋值给变量string。之后该字符串被反转,如果与原始字符串相等,则返回值为true。如果不相等,则显示false的返回值。为什么它会评估一切都是true?

 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");
1个回答

9

tl;dr 将你最后一个正则表达式中的 . 替换为 \. 以去除字面的 . ,因为现在你正在剥离 所有 字符。

问题

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

replace(/./g , '')

作为结果,你正在清空这个字符串。一个空字符串的反转是另一个空字符串,因此你总是会得到一个true的返回值。

解决方案

为了匹配字面上的句号,你必须通过写成\.来转义.。所以,将那部分改为:
replace(/\./g , '')

一些重构方法让你的代码更加优秀

在这里,你也可以直接返回比较的结果,无需使用if/else块。这会让你的整个代码更易读:

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

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

palindrome("nope");

你甚至可以删除所有非字母字符,这样你的代码就会更简单了:
function palindrome(str) {
    var string =str.toLowerCase().replace(/[^a-z]/g, '');

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

palindrome("nope");

好的,这样讲解清楚多了。谢谢! - Codes316
1
string.split("").reverse().join(""); 请注意,这个技巧适用于使用拉丁字符集的英语和其他一些语言,但在使用Unicode字符点> 16位的语言中可能会失败。 - Jeremy J Starcher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接