前後端交互中,定義介面欄位的時候,一般都會藉助一些小工具來定義JSON格式的字元串。我在寫這樣的一個工具的時候碰到一個關於轉義字元的問題。記錄一下。 轉義字元的定義,我理解就是為了區分一些已經有特定意義的字元,去掉這些“特定意義”而轉為普通字元的輔助符號。例如,我們寫正則表達式的時候,+號已經被賦予 ...
前後端交互中,定義介面欄位的時候,一般都會藉助一些小工具來定義JSON格式的字元串。我在寫這樣的一個工具的時候碰到一個關於轉義字元的問題。記錄一下。
轉義字元的定義,我理解就是為了區分一些已經有特定意義的字元,去掉這些“特定意義”而轉為普通字元的輔助符號。例如,我們寫正則表達式的時候,+號已經被賦予了“匹配前面的子表達式一次或多次”的含義,那如何表示純粹的一個+號呢,那就是加上轉義字元,這樣表示\+。
首先,正則表達式的輸入畫風是這樣的:
我們知道,這樣輸入的是字元串。得到的字元串是這樣的:
{"name":"test","nick":"test","type":"id","value":"","require":"","regex":"/^\d{4,8}$/","tips":"","ps":""}
那我們把這個字元串轉化為對象的話,就要調用JSON.parse()了。然而,畫風是這樣的:
沒錯,反斜杠在這裡的作用就是保證d這個字元不被轉義,雖然這裡d不是特殊字元。因此轉了之後,反斜杠就不見了。這樣我們存進數據再取出來的時候。必然是有問題的。那麼怎樣保證轉義字元不被轉義呢。那就是把轉義字元再轉一次。即輸入“/^\d{4,8}$/”,存進資料庫的時候要變成這樣:/^\\d{4,8}$/。
然後,首先想到的是,用正則,匹配所有的反斜杠,然後替換為雙反斜杠。
然而結果是這樣的:
也就是在replace之前,這個反斜杠就沒了。那麼就只能用字元串匹配的方式來轉換了。
這裡有個技巧:先轉換為數組,遍歷。再轉為字元串就好了。
var regex = $dom.find('.basic_regex').val(); var tempRe = regex.split(''); for(var i = 0;i < tempRe.length;i++){ if(tempRe[i] == '\\'){ tempRe[i] = '\\\\'; } } obj.regex = tempRe.join('') || '';
這樣,就把轉義字元轉義了。那麼從資料庫中取出來的時候再轉換的時候,反斜杠就不會丟失啦。
附: