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

如果一個字符串忽略標點符號、大小寫和空格,正著讀和反著讀一模一樣,那么這個字符串就是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.

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

首先,去掉字符串中的標點符號和空白格??梢杂胹tr.replace()+正則表達式匹配。

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

這個比較狠,幾乎把所有的標點符號都去掉了。

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

0000

漂亮,去掉了標點符號和空格。

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

沒錯,用str.toLowerCase();

var newNewStr = newStr.toLowerCase();

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

amanaplanacanalpanama

接下來,把字符串轉換成數(shù)組??梢杂胹tr.split("")

var spl = newNewStr.split("");

這時候"eye"就變成了

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

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

var newSpl = spl.reverse();

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

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

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

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

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的時候寫的,非常不成熟,感謝評論區(qū)@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");
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容