### 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
```