利用正则表达式检测给定的字符是否是回文

如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。

如果给定的字符串是回文,返回true,反之,返回false。

比如

palindrome("eye")应该返回 true.
palindrome("race car")应该返回 true.
palindrome("A man, a plan, a canal. Panama")应该返回 true.
palindrome("1 eye for of 1 eye.")应该返回 false.
palindrome("0_0 (: /-\ :) 0-0")应该返回 true.

最新版简洁的方法更新在最下面

首先,去掉字符串中的标点符号和空白格。可以用str.replace()+正则表达式匹配。

var newStr = str.replace(/[\ |\~|\|!|@|#|$|%|^|&|*|(|)|-|_|+|=|||\|[|]|{|}|;|:|"|'|,|<|.|>|/|?]/g,""); `

这个比较狠,几乎把所有的标点符号都去掉了。

接下来我们看看"0_0 (: /-\ :) 0-0"经过加工会变成什么。

0000

漂亮,去掉了标点符号和空格。

接下来还要大小写转换,回文的话是不区分大小写的,所以我们要把所有的字符全都换成小写(或者大写);

没错,用str.toLowerCase();

var newNewStr = newStr.toLowerCase();

经过两次加工,"A man, a plan, a canal. Panama"
变成了

amanaplanacanalpanama

接下来,把字符串转换成数组。可以用str.split("")

var spl = newNewStr.split("");

这时候"eye"就变成了

["e","y","e"]

接下来,旋转跳跃,反转数组。

var newSpl = spl.reverse();

["e","y","e"]依然还是["e","y","e"]。

但是如果说是["e","y","a"],则会变成

["a","y","e"]

这里要注意,在javascript中,数组是没有办法比较的,所以要把它再转为字符串。

var newRel = newSpl.join("");

这样就得到了反转之后的字符串。
可以开始比较啦。

if (newNewStr == newRel) {
    return true;
  } else return false;

成功,完整代码如下

function palindrome(str) {
  var newStr = str.replace(/[\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]/g,"");  
  var newNewStr = newStr.toLowerCase();
  var spl = newNewStr.split("");
  var newSpl = spl.reverse();
  var newRel = newSpl.join("");
  if (newNewStr == newRel) {
    return true;
  } else return false;
}



palindrome("0_0 (: /-\ :) 0-0");

10月26日更新

更简洁的算法
省去了一些临时变量,直接比较输出。其实 newStr 也可以省去,会更简洁一点,不过这样代码的可读性会大大降低。。

function palindrome(str) {
  var newStr = str.replace(/[\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]/g,"");
  return str == newStr.toLowerCase().split("").reverse().join("");
}

(可能是)最终版更新

由于这个代码是我初学JS的时候写的,非常不成熟,感谢评论区@S1ngS1ng指出的方法。非常简洁

function palindrome(str) {
  // 转换成小写用正则过滤掉符号
  var nStr = str.toLowerCase().replace(/[^a-z0-9]/g,"");
  //验证反转后是否相等
  return nStr.split("").reverse().join("") === nStr;
}



palindrome("A man, a plan, a canal. Panama");

推荐阅读更多精彩内容