regular
1.0.0
1.建構函數方式
var reg = new RegExp ( 'd' , 'gi' ) ;
2、字面量方式
var reg = / d / gi ;
修飾詞有三種: i, g, m
可以同時出現,沒有順序(即gi
與ig
一樣),請參考下方說明
修飾符 | 說明 |
---|---|
i | 忽略大小寫匹配 |
g | 全域匹配,即匹配一個後繼續匹配,直到結束 |
m | 多行匹配,即遇到換行後不停止匹配,直到結束 |
符號 | 作用 |
---|---|
做為轉意,即通常在""後面的字符不按原來意義解釋,如/b/匹配字符"b",當b前面加了反斜桿後/b/,轉意為匹配一個單詞的邊界。 或對正規表示式功能字元的還原,如" "匹配它前面元字元0次或多次,/a /將匹配a,aa,aaa,加了""後,/a*/將只匹配"a *" | |
^ | 符合一個輸入或一行的開頭,/^a/匹配"an A",而不匹配"An a" |
$ | 符合一個輸入或一行的結尾,/a$/匹配"An a",而不匹配"an A" |
. | 匹配任何單一字符,除換行和結束符 |
* | 匹配前面元字元0次或多次,/ba*/將匹配b,ba,baa,baaa |
+ | 匹配前面元字元1次或多次,/ba+/將匹配ba,baa,baaa |
? | 匹配前面元字元0次或1次,/ba?/將匹配b,ba |
(x) | 匹配x保存x在名為$1...$9的變數中 |
x | y |
{n} | 精確匹配n次 |
{n,} | 匹配n次以上 |
{n,m} | 匹配nm次 |
[xyz] | 字元集(character set),符合這個集合中的任一一個字元(或元字元) |
[^xyz] | 不匹配這個集合中的任何一個字符 |
[az] | 任意字母[]中的表示任一個都可以 |
[^az] | 非字母[]中^代表除了 |
[b] | 匹配一個退格符 |
b | 匹配一個單字的邊界 |
B | 匹配一個單字的非邊界 |
cX | 這兒,X是一個控制符,/cM/匹配Ctrl-M |
d | 匹配一個字數字符,/d/ = /[0-9]/ |
D | 匹配一個非字數字符,/D/ = /[^0-9]/ |
n | 匹配一個換行符 |
r | 匹配一個回車符 |
f | 匹配換頁符 |
s | 匹配一個空白字符,包括n,r,f,t,v等 |
S | 匹配一個非空白字符,等於/[^nfrtv]/ |
t | 匹配一個製表符 |
v | 匹配一個重直製表符 |
w | 匹配一個可以組成單字的字元(alphanumeric,這是我的意譯,含數字),包括底線,如[w]匹配"$5.98"中的5,等於[a-zA-Z0-9] |
W | 匹配一個不可以組成單字的字符,如[W]匹配"$5.98"中的$,等於[^a-zA-Z0-9] |
匹配NUL字符 |
零寬斷言用來找出在某些內容(但不包括這些內容)之前或之後的東西,也就是說它們像b,^,$
那樣用來指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言
先行斷言 | 也叫零寬度正預測先行斷言(?=表达式) 表示符合表達式前面的位置 | 例如[az]*(?=ing) 可以符合cooking singing中的cook與sing |
注意:先行斷言的執行步驟是這樣的先從要匹配的字串中的最右端找到第一個ing(也就是先行斷言中的表達式)然後再匹配其前面的表達式,若無法匹配則繼續查找第二個ing再匹配第二個ing前面的字串,若能匹配則匹配
後發斷言 | 也叫零寬度正回顧後發斷言(?<=表达式) 表示符合表達式後面的位置 | 例如(?<=abc).* 可以符合abcdefg中的defg |
注意:後發斷言跟先行斷言恰恰相反它的執行步驟是這樣的:先從要匹配的字串中的最左端找到第一個abc(也就是先行斷言中的表達式)然後再匹配其後面的表達式,若無法匹配則繼續查找第二個abc再匹配第二個abc後面的字串,若能匹配則匹配,例如(?<=abc).*
可以匹配abcdefgabc中的defgabc 而不是abcdefg
負向零寬斷言 | (?!表达式) 也是符合一個零寬度的位置,不過這個位置的「斷言」取表達式的反值,例如(?!表达式) 表示表達式前面的位置,如果表達式不成立,符合這個位置;如果表達式成立,則不符:同樣,負向零寬斷言也有「先行」和「後發」兩種,負向零寬後發斷言為(?<!表达式) |
(?<!表达式)
(?!表达式)
使用小括號將符合的字串包上,然後替換值中可以透過$1表達式來取得到目前正在匹配的值,這裡可以更複雜些,例如存在多個小括號,對應的可以使用$1、$2、 $3來取得對應值,全部替換後,就是我們最終想要的資料了
例如以下是在搜尋框中的正規表示式,就可以把HTML結構中的所有class
屬性給配對出來
className = "([^0-9]+)"
那我們可以在替換中
className = { { $1 } }
那就會把
className = "xxx" //转化为
className = { { xxx } }
1、RegExp物件相關方法
方法名 | 使用場景 | 傳回值 | 範例 |
---|---|---|---|
test | 判斷是否匹配 | true或false | /d/.test('eno yao 2019') |
test | 傳回符合的結果,與match類似 | 數組或null | /d/.exec('eno yao 2019') |
2、String物件相關方法
方法名 | 使用場景 | 傳回值 | 範例 |
---|---|---|---|
match | 傳回符合的結果,非全域條件下與exec傳回結果一致,並擁有指向符合字串的訊息,全域條件下一次傳回所有符合的結果 | 數組或null | 'eno yao 2019'.match(/d/) |
replace | 將字串替換成另外的字串或將正規的匹配字串替換成其他子字串 | 數組或null | 'eno yao 2019'.replace(/d/, '2019') |
search | 尋找第一次符合子字串的位置,傳回index值,否則回傳-1 | index | 'eno yao 2019'.search(/d/, '2019') |
split | 按約定字串或字串拆分數組,接受一個字串或正規則 | index | 'eno yao 2019'.search(/d/, '2019') |