【问题标题】:Determining if a string is a palindrome判断一个字符串是否是回文
【发布时间】:2016-05-21 21:04:19
【问题描述】:

我想知道我的逻辑哪里出了问题。将字符串 (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");

【问题讨论】:

    标签: javascript regex string palindrome


    【解决方案1】:

    tl;dr 将最后一个正则表达式中的 . 替换为 \. 以去除文字 .s;现在,您正在删除 所有 个字符。

    问题

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

    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");
    

    【讨论】:

    • 好吧,这更有意义。谢谢!
    • string.split("").reverse().join(""); 请注意,此技巧适用于英语和其他一些使用拉丁字符集的语言,但在使用 Unicode 字符点 > 16 位的字符的语言中可能会失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    相关资源
    最近更新 更多