注:標題上囊括了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
的錯誤昨稼。