利用正則表達(dá)式檢測給定的字符是否是回文

如果一個(gè)字符串忽略標(biāo)點(diǎn)符號、大小寫和空格,正著讀和反著讀一模一樣,那么這個(gè)字符串就是palindrome(回文)。

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

比如

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

最新版簡潔的方法更新在最下面

首先,去掉字符串中的標(biāo)點(diǎn)符號和空白格。可以用str.replace()+正則表達(dá)式匹配。

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

這個(gè)比較狠,幾乎把所有的標(biāo)點(diǎn)符號都去掉了。

接下來我們看看"0_0 (: /-\ :) 0-0"經(jīng)過加工會變成什么。

0000

漂亮,去掉了標(biāo)點(diǎn)符號和空格。

接下來還要大小寫轉(zhuǎn)換,回文的話是不區(qū)分大小寫的,所以我們要把所有的字符全都換成小寫(或者大寫);

沒錯(cuò),用str.toLowerCase();

var newNewStr = newStr.toLowerCase();

經(jīng)過兩次加工,"A man, a plan, a canal. Panama"
變成了

amanaplanacanalpanama

接下來,把字符串轉(zhuǎn)換成數(shù)組。可以用str.split("")

var spl = newNewStr.split("");

這時(shí)候"eye"就變成了

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

接下來,旋轉(zhuǎn)跳躍,反轉(zhuǎn)數(shù)組。

var newSpl = spl.reverse();

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

但是如果說是["e","y","a"],則會變成

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

這里要注意,在javascript中,數(shù)組是沒有辦法比較的,所以要把它再轉(zhuǎn)為字符串。

var newRel = newSpl.join("");

這樣就得到了反轉(zhuǎn)之后的字符串。
可以開始比較啦。

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日更新

更簡潔的算法
省去了一些臨時(shí)變量,直接比較輸出。其實(shí) newStr 也可以省去,會更簡潔一點(diǎn),不過這樣代碼的可讀性會大大降低。。

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

(可能是)最終版更新

由于這個(gè)代碼是我初學(xué)JS的時(shí)候?qū)懙模浅2怀墒欤兄x評論區(qū)@S1ngS1ng指出的方法。非常簡潔

function palindrome(str) {
  // 轉(zhuǎn)換成小寫用正則過濾掉符號
  var nStr = str.toLowerCase().replace(/[^a-z0-9]/g,"");
  //驗(yàn)證反轉(zhuǎn)后是否相等
  return nStr.split("").reverse().join("") === nStr;
}



palindrome("A man, a plan, a canal. Panama");
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容