代码之家  ›  专栏  ›  技术社区  ›  Codes316

确定字符串是否为回文

  •  3
  • Codes316  · 技术社区  · 9 年前

    我想知道我的逻辑哪里有问题。一根绳子( 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 回复  |  直到 9 年前
        1
  •  9
  •   elixenide Ren    9 年前

    tl;博士 更换 . 在上一个正则表达式中使用 \. 去掉文字 . s现在,你正在脱衣服 全部的 字符。

    问题

    在regex中, . 匹配任何字符(新行除外, \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");