正規式也可以叫做正則表達式,在 JavaScript 中可以使用兩個 / 或 new RegExp 來建立,且其型別為物件
const ares = /a+87/
const ares = new RegExp('a+87')
typeof /a+87/
// object
如需要測試也可使用regex101
正規式常常會用在搜尋與取代兩個地方,讓我們看看如何使用
使用 test 方法可以檢視是否有符合字串,會回傳 true 或是 false
const ares = "Hello everybody, I am a loner."
/friend/.test(ares)
// false
JavaScript 中取代我們會使用 replace 方法,這時候就可以使用正規式
const ares = "Hello everybody, I am a loner."
ares.replace(/loner/, "loser")
// "Hello everybody, I am a loser."
除了單純使用字元來過濾以外,正規式還有許多功能語法,這裡列出大部分的語法~
\\^ 表示匹配 ^ 符號|/aa|cc/ 匹配 aabbcc 中的 aa 或 cc^/^abc/ 表示字串開頭須為 abc[] 內則為排除字串,例如: /[^abc]/ 表示排除所有 abc 開頭字串$^ 相反,表示字尾須匹配的字串,須加在字元後方/abc$/ 表示匹配所有 abc 結尾的字串*/bo*/ 匹配 booed 中的 boo+/bo+/ 不會匹配 brooded 中的任何字元?/bo?/ 匹配 booed 中的 bo.[]- 來指定一個範圍/[a-z]/ 表示匹配 a 到 z 的所有字元{n, m}/a{0, 2}/ 表示匹配 a 出現 0~2 次的字串()/(foo)(bar)\1\2/ 可匹配 foobarfoobar,\1 = foo、\2 = bar$ 符號const abc3 = "foobarfoobar"
abc3.replace(/(foo)(bar)\1\2/, '$1')
// "foo"
(?:y)(),但是不會記憶群組x(?=y)x(?!y)這類有些有大小寫,大小寫匹配的字元都是互補的
\w[A-Za-z0-9_]
\W[A-Za-z0-9_] 以外的字元\s/\s\w*/ 匹配 foo bar 中的 bar\S/\S\w*/ 匹配 foo bar 中的 foo\d[0-9]
\D[^0-9]
\b/\bm/ 匹配 moon 中的 m\B/\B../ 匹配 noonday 中的 oo\r\n\t\xhh、\uhhhh/[\x21]/、/[\u4E00-\u9FA5]/
參數會寫在 / 後方
// 單個參數
const ares = /a+87/g
const ares = new RegExp('a+87', 'g')
// 多個參數
const ares = /a+87/gi
const ares = new RegExp('a+87', 'gi')
再來介紹參數的種類,目前 JavaScript 不只這三種,但是這三個最常用的~
g:global,範圍為全域,不加此參數只會找到第一個i:insensitive,不區分大小寫m:muliti line,可匹配多行,主要應用於 ^ 與 $ 符號// 加上 \n 會換行
const abc1 = "abc123\nabc123\nabc123"
const abc2 = "abc123abc123abc123"
// g
abc2.replace(/a/, "b")
// "bbc123abc123abc123"
abc2.replace(/a/g, "b")
// "bbc123bbc123bbc123"
// i
abc2.replace(/A/gi, "b")
// "bbc123bbc123bbc123"
// m
abc1.replace(/^A/gim, "b")
// "bbc123\nbbc123\nbbc123"
以上就是正規式的簡易介紹,試著用正規式來做一些事情吧!