注:標題上囊括了Node.js和javascript,但這里僅以Node.js作為討論,因為兩者的語法是一致的,只是使用的地方不一樣!
RegExp是Node.js的原生對象,會有什么風險呢?
下面我們做一個簡單的示例:
let str = "\\";
let regx = new RegExp(str);
結果輸出如下:
SyntaxError: Invalid regular expression: /\/: \ at end of pattern
設想一種情況,當我們在Node.js里面,使用mongoose對mongodb按用戶輸入關鍵字來進行模糊查詢時,一般情況下,都會使用RegExp來創(chuàng)建正則表達式對象。那么當用戶輸入了
\\(兩個反斜杠),我們后臺的程序就拋出異常了,如果錯誤數量巨大 ,那么就可能發(fā)生程序掛掉,這是后端開發(fā)需要避免的風險。
如何防范?
在討論如何防范之前,我們得弄明白,出錯的原因在哪里,向下看:
- 在Node.js中,字符串中的
\(反斜杠)代表轉義標記,是對其后的一個或多個字符進行轉義操作,解決字符串的嵌套及特殊字符間的表達沖突問題。而在字符串中\\(兩個反斜杠)僅表示一個字符\(反斜杠),而在正則表達里面,\也代表轉義。 - 在Node.js中, RegExp的作用是以傳入的字符串參數創(chuàng)建一個正則表達式對象,而其內部并沒有對
\進行轉義,于是,本來我們期望的正則/\\/在這里卻變成了/\/,這是不符合語法規(guī)范的,所以這就是為什么會報上面的SyntaxError的原因了。
好了,知道出錯原因,我們開始做防范措施了,以下是我的一個解決方案,可以根據需要自行制訂:
let str = "\\";
str = str.replace(/\\/ig, "\\\\");
let regx = new RegExp(str);
等等,為什么要替換成功\\\\(四個反斜杠),而不是兩個反斜杠?以下解釋一下(這里有點繞):
let str = "\\";表示要匹配的是一個\(一個反斜杠)字符;
str.replace表示替換把一個反斜杠替換成兩個反斜杠, 所以此時str的值為\\\\;
經過以上的操作,結果regx的值為/\\/;
如果替換成兩個反斜杠,最終也會報SyntaxError的錯誤。