3月 12, 2020 Javascript
### 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
```
過去文章
2025 (9)
4 (5)
3 (1)
2 (3)
2024 (25)
11 (3)
10 (3)
9 (1)
3 (18)
2022 (6)
10 (1)
6 (2)
5 (1)
3 (1)
1 (1)
2021 (21)
11 (7)
7 (1)
6 (2)
5 (2)
4 (6)
3 (2)
2 (1)
2020 (92)
12 (1)
11 (2)
10 (4)
9 (10)
8 (5)
7 (1)
6 (3)
5 (1)
4 (4)
3 (25)
2 (7)
1 (29)
2019 (57)
12 (25)
11 (7)
9 (25)