RegExp 正規運算式 全名是 regular expression
是電腦科學的一個概念。正規表示式使用單個字串來描述、符合一系列符合某個句法規則的字串。在很多文字編輯器裡,正則表達式通常被用來檢索、替換那些符合某個模式的文字。
除了自身的方法(exec和test)中,還常在String字串的 match、replace、search、split等方法中被運用。
正規表達式有兩個建立方式,分別是Literal notation(文字表示法)及constructor(建構子函式)
將pattern(樣式)放在兩個"/"斜線中間
const shark = /ab+c/flag;
//字串"ab+c"為pattern,放在兩個"/"的中間
RegExp 正規運算式,是一個物件,而且是一個有constructor的物件,所以可以用new的方式來建立一個RegExp 正規運算式,而建立的方式又依參數的使用分為兩類,string pattern跟regular expression
const sharkA = new RegExp('ab+c',flag)
// string pattern 用字串當參數
const sharkA = new RegExp(/ab+c/,flag)
// regular expression 用RegExp當參數
補充 flag(旗標)
flag(旗標)的位置是放在最後一個"/"的後面,或是constructor的第二個參數,目前JavaScript支援的flag(旗標)有三個。
首先,下面這些標點符號,在正規表達是中有特別的意義
^ $ . * + ? = ! : | \ / ( ) [ ] { }
經過這些標點符號的組合可以製造出不同的意義的RegExp,可區分下面幾類
。
Character classes 字符類別
用來區分字母及數字及規範相關符號
\d 匹配任何數字
\D 匹配數字以外的字元
\w 匹配任何英文字母及數字
\W 匹配任何英文字母及數字以外的字元
\s 匹配任何Unicode的空白字元
\S 匹配任何Unicode的空白字元以外的字元
\ 轉譯,+一個字母會變成另一個意思
. 以這結尾的字符 .+字母,匹配以這個字母結尾的詞彙
\n 匹配換行符號
| 匹配"|"符號前後兩個字元其一,就像是or
Assertions 斷言
將單字拆開來做匹配
^ 匹配輸入開頭,EX:^字母A,輸入開頭的必須是字母A
$ 匹配輸入的結束,EX:$字母A,輸入結尾的必須是字母A
\b 匹配一個詞彙的邊界,用來找尋符合條件的開頭或是結尾,EX:\bmo,詞彙的開頭必須是mo,或是on\b,詞彙的結尾是on。
\B 匹配非一個詞彙的邊界,EX:\Bmo,有mo詞彙的但是不能在開頭,或是on\B,有on詞彙的但是不能在結尾。
Groups and backreferences
(x) Capturing group捕獲組,匹配出符合內容的詞彙並將其內容製成群組輸出。
(?x) Named capturing group,跟上面類似,只是會透過Name儲存匹配到的內容,並透過.groups.Name取出。
(?:x) Non-capturing group :語法相對於 capturing group,表示僅需要用作 group 的用途,但不需要製成群組。
\n n是一個正整數,這是一個反向的引用,\n的前面通常是一個詞彙B,匹配條件是:詞彙B的後面n個字母
\k 要跟(?x)配合使用,使用k之前必須要有一個(?x),表示跟(?x)匹配出的值一樣。
Quantifiers (量詞)
表示要匹配的字符或表達式的數量
x* 匹配x出現0次或是多次
x+ 匹配x出現1次獲是多次
x? 匹配x出現0或是0次,表示x非必需的時候
x{n} 匹配x剛好重複n次
x{n,} 匹配x重複n次以上
x{n,m} 匹配x重複n次以上,但是不超過m次
上面的匹配方式被稱作"greedy"貪婪的,會盡可能找出符合匹配的值,所以通常會在後面加一個?讓他變成"non-greedy"非貪婪的,讓她找到一個匹配項目就結束。
Unicode property escapes
前一陣子有提到,javaScript會透過Unicode進行轉碼,所以匹配的方式也有透過Unicode進行匹配,可以製作出除了文字符號之外更多的匹配條件。
補充[] 跟 ^
[...] 匹配[]內的任何字元
[^...] 匹配除了[]內以外的任何字元
資料來源
JavaScript大全-第六版
MDN-RegExp
Wiki-Regular expression
Regex 正規表示法 - 群組與環顧 (Groups & Lookaround)