确定字符串是否是回文

时间:2016-05-21 21:04:19

标签: javascript regex string palindrome

我想知道我的逻辑错误在哪里。将字符串(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");

1 个答案:

答案 0 :(得分: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");