【问题标题】:How to remove all non-alphabet characters, javascript [duplicate]如何删除所有非字母字符,javascript [重复]
【发布时间】:2017-09-18 09:43:44
【问题描述】:

我被要求检查一个字符串是否是回文。 不区分大小写。忽略所有不是字母的字符。

我的答案

 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 中找不到比上述更好的解决方案。

有没有比写出每个可能的要删除/替换的字符更快/更好的方法? (尤其是因为我写的内容远非详尽……)

【问题讨论】:

  • 错误的重复链接,链接有Java解决方案。这是我搜索的一个JS解决方案:stackoverflow.com/questions/9364400/…
  • 正则表达式 \W 带走了大部分选项,但不是全部。 palindrome("_eye") 仍然没有返回 True。我上面给出的字符串示例也没有。
  • @Doomenik 好的,谢谢,这个答案总结了它。我还需要加 _ 来去掉下划线。
  • @Chuck 你可以使用这个正则表达式:/[^a-z]/ig
  • 刚试过,效果很好。我在哪里可以找到关于 [^A-Za-z0-9] 的确切含义/作用的解释...?

标签: javascript regex string replace palindrome


【解决方案1】:

无需调用 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。

【讨论】:

  • 您能否举例说明您的意思。
猜你喜欢
  • 1970-01-01
  • 2018-12-02
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 2014-04-26
  • 1970-01-01
  • 2012-07-04
相关资源
最近更新 更多