如何删除所有非字母字符,javascript

时间:2017-09-18 09:43:45

标签: javascript regex string replace palindrome

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

我的回答

 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 个答案:

答案 0 :(得分:0)

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

对于循环来说,这将是我认为最快的方式,因为它快速而简单。一旦找到第一个不匹配的字符,您就可以返回false。