先後端交互中,定義接口字段的時候,通常都會藉助一些小工具來定義JSON格式的字符串。我在寫這樣的一個工具的時候碰到一個關於轉義字符的問題。記錄一下。git
轉義字符的定義,我理解就是爲了區分一些已經有特定意義的字符,去掉這些「特定意義」而轉爲普通字符的輔助符號。例如,咱們寫正則表達式的時候,+號已經被賦予了「匹配前面的子表達式一次或屢次」的含義,那如何表示純粹的一個+號呢,那就是加上轉義字符,這樣表示\+。github
首先,正則表達式的輸入畫風是這樣的:正則表達式
咱們知道,這樣輸入的是字符串。獲得的字符串是這樣的:數據庫
{"name":"test","nick":"test","type":"id","value":"","require":"","regex":"/^\d{4,8}$/","tips":"","ps":""}
那咱們把這個字符串轉化爲對象的話,就要調用JSON.parse()了。然而,畫風是這樣的:json
沒錯,反斜槓在這裏的做用就是保證d這個字符不被轉義,雖然這裏d不是特殊字符。所以轉了以後,反斜槓就不見了。這樣咱們存進數據再取出來的時候。必然是有問題的。那麼怎樣保證轉義字符不被轉義呢。那就是把轉義字符再轉一次。即輸入「/^\d{4,8}$/」,存進數據庫的時候要變成這樣:/^\\d{4,8}$/。後端
而後,首先想到的是,用正則,匹配全部的反斜槓,而後替換爲雙反斜槓。數組
然而結果是這樣的:dom
也就是在replace以前,這個反斜槓就沒了。那麼就只能用字符串匹配的方式來轉換了。工具
這裏有個技巧:先轉換爲數組,遍歷。再轉爲字符串就行了。ui
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('') || '';
這樣,就把轉義字符轉義了。那麼從數據庫中取出來的時候再轉換的時候,反斜槓就不會丟失啦。
附: