我們常常會使用到 Regular Expression 來驗證字串的格式,由日期、電話號碼到特定的格式都可以用 Regular Expression 表達出來。而在 Javascript 中使用者可以使用 new RegExp()
來建立 Regular Expression 物件。
// create regexp object var re1 = /^\d{4}-\d{2}-\d{2}$/i; // create regexp object var re2 = new RegExp('^\d{4}-\d{2}-\d{2}$', 'i'); console.log(re1.test('2019-11-22')); // true console.log(re2.test('2019-11-22')); // true
它們的運作是一樣功能的。由上面的代碼推算出,我們可以透過使用 new RegExp()
來動態建立一個 Regular Expression Object。
// create regex by providing pattern string const createRegExp = string => new RegExp('/^' + string + '$/');
上面代碼雖然很方便,但是如果有使用者輸入了和 Regular Expression 相同的保留字,就會有可能把你的程式弄壞了 !!
// create regex var re1 = createRegExp('*^*^*$*');
這樣就會把程式弄壞了。要防止這個情況,我們需要為傳入的參數 Escape 走 Regular Expression 的保留字。例如以下字符 :
\ ^ $ * + ? . ( ) | { } [ ]
我們可以寫一個 Function 把上面的字符 Escape,然後回傳出去。
/** * escape regexp */ const escapeRegExp = string => { // $& means the whole matched string return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } // example escapeRegExp("All of these should be escaped: \ ^ $ * + ? . ( ) | { } [ ]"); // result >>> "All of these should be escaped: \\ \^ \$ \* \+ \? \. \( \) \| \{ \} \[ \]"
經過 Escape 後的字串就可以放心放到 new RegExp()
中使用,以產生 Regular Expression Object。
參考網址 : https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
另外已經有大神把 Function 打包,放到 NPM 上去了,只要使用 NPM 下載就可以直接使用。
# npm install escape-string-regexp
### Regular Expression 我們常常會使用到 Regular Expression 來驗證字串的格式,由日期、電話號碼到特定的格式都可以用 Regular Expression 表達出來。而在 Javascript 中使用者可以使用 `new RegExp()` 來建立 Regular Expression 物件。 ```js // create regexp object var re1 = /^\d{4}-\d{2}-\d{2}$/i; // create regexp object var re2 = new RegExp('^\d{4}-\d{2}-\d{2}$', 'i'); console.log(re1.test('2019-11-22')); // true console.log(re2.test('2019-11-22')); // true ``` 它們的運作是一樣功能的。由上面的代碼推算出,我們可以透過使用 `new RegExp()` 來動態建立一個 Regular Expression Object。 ```js // create regex by providing pattern string const createRegExp = string => new RegExp('/^' + string + '$/'); ``` ### 產生問題 上面代碼雖然很方便,但是如果有使用者輸入了和 Regular Expression 相同的保留字,就會有可能把你的程式弄壞了 !! ```js // create regex var re1 = createRegExp('*^*^*$*'); ``` 這樣就會把程式弄壞了。要防止這個情況,我們需要為傳入的參數 Escape 走 Regular Expression 的保留字。例如以下字符 : ```txt \ ^ $ * + ? . ( ) | { } [ ] ``` 我們可以寫一個 Function 把上面的字符 Escape,然後回傳出去。 ```js /** * escape regexp */ const escapeRegExp = string => { // $& means the whole matched string return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } // example escapeRegExp("All of these should be escaped: \ ^ $ * + ? . ( ) | { } [ ]"); // result >>> "All of these should be escaped: \\ \^ \$ \* \+ \? \. \( \) \| \{ \} \[ \]" ``` 經過 Escape 後的字串就可以放心放到 `new RegExp()` 中使用,以產生 Regular Expression Object。 > 參考網址 : https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex ### NPM Package 另外已經有大神把 Function 打包,放到 NPM 上去了,只要使用 NPM 下載就可以直接使用。 ```sh # npm install escape-string-regexp ```