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
我想在 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