如何移除所有非字母字符,JavaScript

4
我被要求检查一个字符串是否为回文。 不区分大小写。忽略所有非字母字符。
 function palindrome(str) {
  var oldStr = str.toLowerCase().replace(/\s+|\,|\.|\_|\-|\:|\(|\)|\/|\\/g,  '');

  var newStr = str.replace(/\s+|\,|\.|\_|\-|\:|\(|\)|\/|\\/g, '').split("").reverse().join("").toLowerCase();

  if ( oldStr === newStr){
    return true;
  }
  else {
    return false;
  }
}
palindrome("ininiNI");

该函数的作用是检查任何字符串是否可能成立。 例如:("0_0 (: /-\ :) 0-0"),根据要求应返回true。

我在JavaScript中找不到比上面这个更好的解决方案。

有没有比仅编写每个可能被删除/替换的字符更快/更好的方法?(特别是因为我编写的远非详尽无遗...)


1
链接错误重复,这里有一个Java解决方案。我找到了一个JS解决方案:https://dev59.com/pmox5IYBdhLWcg3wNBnS - Doomenik
1
正则表达式\W排除了大多数选项,但并非全部。 palindrome(“_eye”)仍然不返回True。上面我给出的字符串示例也不是。 - Chuck
@Doomenik 哦,好的,谢谢。那个答案总结得很好。我还需要添加 _ 来去掉下划线。 - Chuck
@Chuck,你可以直接使用这个正则表达式:/[^a-z]/ig - cнŝdk
@Doomenik 看起来可能有点难以理解,但是当你使用它时它非常有用和强大 ;) - cнŝdk
显示剩余5条评论
1个回答

3

不需要两次调用 toLowerCase() 和 replace()。你也可以将字符串分成两半,颠倒其中一部分,然后进行比较。这样可以至少加快函数速度几倍。

优化后的函数可能如下所示:

function palindrome(str) {
  str = str.toLowerCase().replace(/[^a-z]/g, '');
  var max = str.length - 1;
  for (var i = Math.floor(max / 2); i >= 0; i--) {
    if (str[i] != str[max - i]) {
      return false;
    }
  }
  return true;
}

palindrome("inabcbani"); //true
palindrome("abcddcba"); //true
palindrome("a*#$(b)&^@%@%(*a"); //true
palindrome("abba"); //true
palindrome("abcdba"); //false

在我看来,for循环是最快的方法,因为它快速而简单。一旦找到第一个不匹配的字符,就可以返回false。


你能举个例子来说明你的意思吗? - Chuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接