正則表示式(JS表格簡要總結)
阿新 • • 發佈:2020-04-18
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屬性上引用該組名 示例1 : let result = /(?<year>\d{4})-(?<month>\d{2})/.exec('2019-10'); // result=['2019-10','2019',10] result.groups={year:'2019', month:'10'} 注意 :如果要在正則表示式內部引用某個“具名組匹配”,可以使用 \k<組名> 的寫法,同時陣列引用也依然有效 示例2 :let 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 |