JavaScript回文函数问题:结果异常且无法移除下划线
修复你的回文判断函数问题
我看到你的代码里有几个关键问题导致结果全部不符合预期,而且下划线也没被正确移除,咱们一个个拆解解决:
1. 正则表达式错误(下划线未被移除)
你写的正则/[^\w_]/gi逻辑搞反了:\w本身就包含字母、数字和下划线,这个正则的意思是「匹配不是单词字符且不是下划线的字符」——相当于直接保留了下划线和所有单词字符,完全不符合你要移除非字母数字的需求。
正确的正则应该匹配所有非字母数字的字符(包括下划线),推荐两种写法:
/[^a-zA-Z0-9]/gi:直接指定保留大小写字母和数字,其余全部移除/[\W_]/gi:\W是\w的反义(非单词字符),加上下划线后,刚好覆盖所有非字母数字内容
2. 循环里的两个致命错误
- 你用原字符串
str[i]去比较,但str没有经过任何处理(还带着空格、标点等),应该用处理后的repStr[i] repStr[len] - i是把字符的ASCII码和i做减法运算,而不是取对应索引的字符!正确的索引写法是repStr[len - i]
3. 其他优化点
len = repStr.length -1没有用var/let/const声明,会变成全局变量,建议加上声明避免污染全局作用域- 循环条件
i <= len会让循环重复比较中间字符(比如长度为奇数的字符串),改成i < repStr.length / 2只比较前半段,效率更高
修正后的完整代码
function palindrome(str) { // 匹配所有非字母数字字符(含下划线)并替换为空 var exc = /[\W_]/gi; var repStr = str.toLowerCase().replace(exc, ""); console.log("Replaced string: " + repStr); const len = repStr.length - 1; // 仅比较字符串前半段即可 for (var i = 0; i < repStr.length / 2; i++) { if (repStr[i] !== repStr[len - i]) { return false; } } return true; } // 运行测试用例 console.log(palindrome("eye")); // true console.log(palindrome("_eye")); // true console.log(palindrome("race car")); // true console.log(palindrome("not a palindrome")); // false console.log(palindrome("A man, a plan, a canal. Panama")); // true console.log(palindrome("never odd or even")); // true console.log(palindrome("nope")); // false console.log(palindrome("almostomla")); // false console.log(palindrome("My age is 0, 0 si ega ym")); // true console.log(palindrome("1 eye for of 1 eye.")); // false console.log(palindrome("0_0 (: /-\\ :) 0-0")); // true console.log(palindrome("five|\\_|/|four")); // false
现在运行测试用例,结果就完全符合预期了:下划线被正确移除,回文判断逻辑也准确。比如_eye处理后变成eye,会返回true;0_0 (: /-\ :) 0-0处理后变成0000,也能正确识别为回文。
内容的提问来源于stack exchange,提问作者Hacene .N




