1. 程式人生 > >正則表示式(JS表格簡要總結)

正則表示式(JS表格簡要總結)

1. JS中正則表示式定義

JavaScript 中的正則表示式用 RegExp 物件表示。

JS中定義正則表示式的兩種方法:

方法 示例
RegExp 物件 var pattern = new RegExp("s");
直接量 var pattern = /s/;

2. 直接量字元

正則表示式中的所有字母和數字都是按照字面含義進行匹配的,同樣也支援非字母數字的字元匹配,這些字元需要通過反斜線 '\' 作為字首進行轉義。

除了字母和數字之外的字元都需要通過反斜線\ 來轉義。

正則表示式中的直接量字元:

直接量字元 匹配
字母和數字字元 自身
\o NUL字元(\u0000)
\t 製表符(\u0009)
\n 換行符(\u000A)
\v 垂直製表符(\u000B)
\f 換頁符(\u000C)
\r 回車符(\u000D)
\xnn 由16進位制數nn指定的拉丁字元,例如,\x0A等價於\n
\uxxxx 由16進位制數xxxx指定的Unicode字元,例如\u0009等價於\t

3. 字元類

將直接量字元單獨放在方括號內就組成了字元類。

正則表示式中的字元類:

字元類 匹配
[...] 方括號內的任意字元
[^...] 不在方括號內的任意字元
. 除換行符和其它Unicode行終止符之外的任意字元
\w 任何ASCII字元組成的單詞,等價於 [a_zA-Z0-9]
\W 任何不是ASCII字元組成的單詞,等價於 [^a-zA-Z0-9]
\s 任何Unicode空白符
\S 任何非Unicode空白符
\d 任何ASCII數字,等價於 [0-9]
\D 除了ASCII數字之外的任何字元,等價於 [^0-9]

4. 重複字元

正則表示式中的重複字元:

重複字元 含義
{n,m} 匹配前一項至少n次,但不超過m次
{n,} 匹配前一項n次或更多次
{n} 匹配前一項n次
匹配前一項0次或1次,等價於 {0,1}
+ 匹配前一項1次或多次,等價於 {1,}
* 匹配前一項0次或多次,等價於 {0,}

預設為貪婪匹配,若要實現非貪婪匹配,只需在待匹配的項後面加1個 ?

即可。

詳細說明見貪婪匹配和非貪婪匹配。

5. 選擇,分組和引用

正則表示式中的選擇、分組和引用字元:

字元 含義
| 選擇,匹配的是該符號左邊或右邊的子表示式
(...) 組合,將幾個項組合成一個單元,可以記住和這個組合相匹配的字串。var result = 'JavaScript'.match(/(Java)Script/) result[0] = 'JavaScript' result[1] = 'Java' result[1] 中的內容就是(Java)組合中匹配到的字串
(?:...) 把幾個項組合成一個單元,但是不記住和這個組合相匹配的字串
(\n) 和第n個分組第一次匹配的字元相匹配,組是圓括號中的子表示式(也可能是巢狀的),組索引是從左到右的做括號數。 /(['"])[^'"]*\1/這樣當 (['"]) 中匹配的是單引號時,\1 就是單引號,當 (['"]) 中匹配的是雙引號時,\1 就是雙引號,這樣保證了前後的一致性。
(?<name>)(提案) 具名組 格式:“問號+尖括號+組名” 作用:為每一個組匹配指定一個名字 ,可以通過exec方法返回結果的groups屬性上引用該組名 示例1let result = /(?<year>\d{4})-(?<month>\d{2})/.exec('2019-10'); // result=['2019-10','2019',10] result.groups={year:'2019', month:'10'} 注意:如果要在正則表示式內部引用某個“具名組匹配”,可以使用 \k<組名> 的寫法,同時陣列引用也依然有效 示例2let result = /^(?<word>[a-z]+)!\k(word)!\1$/.test('abc!abc!abc') // true let result = /^(?<word>[a-z]+)!\k(word)!\1$/.test('abc!abc!ab') // false

6. 指定匹配位置

正則表示式中的錨字元:

字元 含義
^ 匹配字串的開頭,在多行匹配(有修飾符m)中匹配每一行的開頭
$ 匹配字串的結尾,在多行匹配(有修飾符m)中匹配每一行的結尾
\b 匹配一個單詞的邊界,簡言之,就是位於字元 \w\W 之間的位置,或位於字元 \w 和字串的開頭或者結尾之間的位置(但需要注意, [\b]匹配的是退格符)
\B 匹配非單詞邊界的位置
(?=p) 零度正向先行斷言,要求接下來的字元要與p匹配,並且匹配的結果不包含p,如 var result = 'JavaScript:a'.match(\JavaScript(?=:)\) 匹配結果: result[0]='JavaScript' JavaScript 後面要緊跟著是 ':' 才能匹配成功,並且結果中不包含 ':'
(?!p) 零度負向先行斷言,要求接下來的字元不與p匹配
(?<=p)(提案) 後行斷言,要求前面的字元要與p匹配,並且匹配的結果中不包含p,如 var result = /(?<=\$)\d+/.exec('$100*80'); // result=['100']
(?<!p) 後行否定斷言,要求前面的字元不能與p匹配,並且匹配結果中不包含p,如 var result= /(?!\$)\d+/.exec('$100*80'); // result=['80']

7. 修飾符

正則表示式中的修飾符:

字元 含義
i 忽略大小寫
g 全域性匹配,也就是找到所有的匹配,而不是找到第一個匹配之後就停止
m 多行匹配,^匹配每一行的開頭,$匹配每一行的結尾
u(ES6) 能夠處理碼點大於 \uFFFF 的Unicode字元,即能夠處理4個位元組的UTF-16編碼
y(ES6) “粘連”修飾符,匹配必須從未匹配字串的第一個位置開始,即暗含頭部匹配。下一次的匹配是在lastIndex的位置開始匹配。詳細說明見[ES6y修飾符]( <https://blog.csdn.net/qq_43199318/article/details/102489816 )。
s(提案) 使 '.' 修飾符可以匹配任意一個字元

8. String 方法

String支援的4中使用正則表示式的方法:

String方法 用法
search() 引數:一個正則表示式 ,若不是,會先通過RegExp建構函式將其轉換成正則表示式 返回值:第一個與之匹配的子串的起始位置,若匹配失敗返回-1 注意:不支援全域性搜尋,忽略g修飾符 示例'JavaScript'.search(/Script/); // 4
replace() 引數:第一個是正則表示式,第二個是要進行替換的字串 返回值:替換後的字串 注意:如果第一個引數不是正則表示式,不會進行轉換 示例'javascript'.replace(/\w+/,'JavaScript'); // JavaScript
match() 引數:一個正則表示式,若不是,會先通過RegExp建構函式將其轉換成正則表示式 返回值:非全域性匹配時:一個數組,第一個元素是與正則表示式相匹配的字串,餘下的元素是與圓括號(分組)內的子表示式匹配的字串 全域性匹配時:一個數組,元素由正則表示式相匹配的字串組成,也就是隻有非全域性匹配時返回陣列的第一個元素 注意:非全域性匹配時,返回的陣列帶有兩個屬性,input:要匹配的字串 index:匹配成功的子串的起始位置 示例var result = '1+2=3'.match(/\d+/); //result[0]='1' result.index=0 result.input='1+2=3' var result = '123'.match(/(1)/d+/); // result[0]='123' result[1]='1'result.index=0 result.input='123' 全域性匹配時var result = '123'.match(/(1)/d+/g); // result[0]='123' 沒有index,input等屬性,也沒有result[1]
split() 引數:可以是一個字串也可以是一個正則表示式 返回值:將一個字串拆分為一個子串組成的陣列 示例'1, 2, 3'.split(','); // ['1', '2', '3'] '1, 2, 3'.split(/\s*,\s*/); //['1','2','3']

9. RegExp物件

RegExp的屬性:

屬性 含義
source 只讀字串,包含正則表示式文字
global 只讀布林值,說明是否帶有全域性匹配修飾符g
ignoreCase 只讀布林值,說明是否帶有忽略大小寫修飾符i
multiline 只讀布林值,說明是否帶有多行匹配修飾符m
lastIndex 可讀寫的整數,儲存下一下匹配時的起始位置
sticky(ES6) 只讀布林值,表示是否設定了y修飾符
flags(ES6) 返回正則表示式的修飾符 /abc/ig.flags // 'gi'

RegExp的方法:

<
方法 用法
exec() 引數:一個字串 返回值:無論是否是全域性匹配,都返回一個數組,並且第一個元素是與正則表示式相匹配的字串,餘下的元素是與圓括號內的子表示式相匹配的字串 注意:無論是否是全域性匹配返回的陣列都帶有index和input屬性 示例var result = /(1)\d+/.exec('123'); // result[0]='123 result[1]='1' result.index=0 result.input='123' var result = /(1)\d+/g.exec('123); //result[0]='123' result[1]='1' result.index=0 result.input-'123' 全域性匹配
test() 引數: 一個字串 返回值:如果包含正則表示式的一個匹配結果,返回true,否則返回null 示例/\d+/.test('123'); // true /\d+/.test('abc'); // null