JavaScript 中的回文检查器 - 不知道如何调试

Palindrome Checker in JavaScript - don't know how to debug

我想在 javascript 中构建一个回文检查器。所有非字母字符都应该被删除,这样像 "A man, a plan, a canal. Panama" 这样的短语也可以是回文。

function reverse(str) {
  return str.split("").reverse().join("");
}


function palindrome(str) {
  str = str.replace(/[^a-zA-Z]+/,"").toLowerCase();
  if(str == reverse(str)) {
    return true;
  }
  else {
    return false;
  }
}

现在,上面几行中的错误在哪里?

该代码适用于某些示例。但是例如 "A man, a plan, a canal. Panama" 和 "never odd or even" return false,这意味着某处一定是错误的。

您需要为正则表达式提供 global match flag

/[^a-zA-Z]+/g
            ^

这是一个常见的误解。 replace() 方法不会替换字符串中要替换的所有实例。它只是替换第一个实例并停止。如果你像这样重构你的正则表达式:

function reverse(str) {
  return str.split("").reverse().join("");
}


function palindrome(str) {
    var find = "[^a-zA-Z]";
    var regEx = new RegExp(find, 'g');
  str = str.replace(regEx,"").toLowerCase();
  if(str == reverse(str)) {
    return true;
  }
  else {
    return false;
  }
}

那行得通。

从给出的示例来看,在我看来代码不适用于字母之间的空格。 (可能还有其他场景)

我已经更改了这一行:

str = str.replace(/[^a-zA-Z]+/,"").toLowerCase();

对此:

str = str.toLowerCase().replace(/[^a-z]/g,"");

更改此行:

str = str.replace(/[^a-zA-Z]+/,"").toLowerCase();

对此:

str = str.toLowerCase().replace(/[^a-z0123456789]+/g,""); 

此正则表达式应该适用于您的代码。

/[^1-9a-zA-Z]+/g