我想用javascript构建一个回文检查器。所有非字母字符都应该删除,这样像“一个人,一个计划,一条运河。巴拿马”这样的短语也可以是回文。
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;
}
}
现在,上面几行的错误在哪里?
该代码适用于一些示例。但例如“一个人,一个计划,一条运河。巴拿马”和“从不奇数或偶数”返回false,这意味着某个地方一定是错误的。
您需要向正则表达式提供全局匹配标志:
/[^a-zA-Z]+/g
^
这是一个常见的误解。替换()方法不会替换字符串中要替换的所有实例。它只是替换第一个实例并停止。如果你像这样重构你的正则表达式:
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,"");