正則運算式
正則運算式是用于匹配字串中字符組合的模式,在JavaScript中,正則運算式也是物件,這些模式被用于RegExp的 exec和 text方法,以及String中的 match、matchAll、replace 、search 和split方法
創建運算式
字面量
使用兩個 / 直接創建正則表達,已斜杠表示開始和結束
var reg = /ab/g
當腳本加載后,正則運算式字面量就會被編譯,當正則運算式保存不變時,使用此方法可獲得更好的性能,
RegExp建構式
var reg = new RegRxp('ab','g')
// 等價于 var reg = /ab/g
字面量創建斜杠結束后面引數和建構式第二個引數表示修飾符,
上面兩種寫法是等加價的都新建了一個在正則運算式物件,區別在于,第一種再引擎編譯代碼時,就會新建正則運算式,第二種方法在運行時新建運算式,所以字面量效率更高,并且字面量比較便利直觀,基本上都會采用字面量定義正則運算式,
實體屬性
正則修飾符相關實體屬性(只讀)
ignoreCase:回傳布林值,表示是否設定了i修飾符global:回傳布林值,表示是否設定了g修飾符multiline:回傳布林值,表示是否設定了m修飾符flags:回傳一個字串,包含設定的所有修飾符
與修飾符無關實力屬性:
lastIndex:回傳一個證書,表示下一次開始搜索的位置source:回傳正則運算式的字串形式,只讀
var reg = /abc/gim
//修飾符相關屬性
reg.ignoreCase //true
reg.global //true
reg.multiline //true
reg.flags //gim
//修飾符無關屬性
reg.lastIndex //0
reg.source //abc
實體方法
正則實體方法
test()
在字串中測驗是否匹配,回傳值味 true 或 false
var reg = /av/g
var s = 'avbabc'
reg.test(s) //true
reg.lastIndex = 2
reg.test(s) //false
當正則運算式帶有g修飾符時,每一次test方法都會從上一次結束的位置開始向后匹配,可以使用lastIndex查看當前位置
var reg = /av/g
var s = 'avbavabc'
reg.lastIndex //0
reg.test(s) //true
reg.lastIndex //2
reg.test(s) //true
reg.lastIndex //5
reg.test(s) //false
如果正則運算式是一個空字串,則匹配所有的字串,都回傳true
exec()
在字串中執行查找匹配的字符,回傳一個陣列,未匹配到回傳null
exec方法回傳陣列包含兩個屬性:
input:整個原字串index:模式匹配成功的開始位置索引
var reg = /av/g
var s = 'avbavabc'
reg.exec(s) //["av", index: 0, input: "avbavabc", groups: undefined]
reg.exec(s) //["av", index: 3, input: "avbavabc", groups: undefined]
reg.exec(s) //null
同test一樣,當正則運算式帶有g修飾符時,每一次exec方法都會從上一次結束的位置開始向后匹配,可以使用lastIndex查看當前位置
當正則運算式包含()組匹配時,回傳的陣列包含多個匹配資料,第一個是整個正則匹配成功的結果,第二個為括號內的匹配結果,如果有多個括號,第三個為第二個括號內的匹配內容,依次類推,
var reg = /a(v)/g
var s = 'avbavabc'
reg.exec(s) //[ 'av', 'v', index: 0, input: 'avbavabc', groups: undefined ]
reg.exec(s) //[ 'av', 'v', index: 3, input: 'avbavabc', groups: undefined ]
reg.exec(s) //null
多個()
var reg = /a(v)(b)/g
var s = 'avbavabc'
reg.exec(s) // [ 'avb', 'v', 'b', index: 0, input: 'avbavabc', groups: undefined ]
reg.exec(s) //null
String實體方法
match()
在字串中執行查找匹配的字符,回傳一個陣列,未匹配到回傳null
當正則運算式不帶有g修飾符是,回傳的陣列帶有index和iuput屬性
var reg = /ac/
var s = 'acbacvabc'
var s1 = 'aabaavabc'
s.match(reg) //[ 'ac', index: 0, input: 'acbacvabc', groups: undefined ]
s1.match(reg) //null
正則運算式帶有g修飾符時,該方法會一次性回傳所有匹配成功的結果陣列,不再帶有index和input屬性
var reg = /ac/g
var s = 'acbacvabc'
s.match(reg) //[ 'ac', 'ac' ]
注意:設定正則運算式的lastindex屬性對match方法無效,match方法總是從字串第一個開始匹配,
matchAll()
在字串中執行查找所有匹配的字符,回傳一個迭代器,注意 ,在使用matchAll時,正則運算式需要帶有g修飾符,否則會運行報錯,
var reg = /a/g
var s = 'acbacvabc'
arr = [...s.matchAll(reg)]
console.log(arr)
//輸出:
/**
[
[ 'a', index: 0, input: 'acbacvabc', groups: undefined ],
[ 'a', index: 3, input: 'acbacvabc', groups: undefined ],
[ 'a', index: 6, input: 'acbacvabc', groups: undefined ]
]
**/
search()
在字串中執行查找匹配的字符,回傳第一個匹配到字符的位置,未匹配到回傳-1
var reg = /en/g
var reg1 = /yo/g
var s = 'yuwenbo'
s.search(reg) //3
s.search(reg1) //-1
replace()
在字串中執行查找匹配的字符,并且使用替換字串替換匹配到的子字串,兩個引數一個是正則運算式,一個是需要替換的內容,
如果正則沒有g修飾符,只替換第一個匹配成功的值,如果有g修飾符,則替換所有匹配成功的值,
var s = 'i love you'
console.log(s.replace(/\s/, '?')) //i?love you
console.log(s.replace(/\s/g, '?')) //i?love?you
replace第二個引數可以使用$符號,用來更加方便的制定所替換的內容
$&:匹配的子字串- `$``:匹配結果前面的文本
$':匹配結果后面的文本$n:匹配成功的第n組內容,n是從1開始的自然數$$:指代美元符號$
console.log('he llo'.replace(/(\w+)\s(\w+)/, '$2 $1')) //llo he
console.log('hello'.replace(/e/, '-$`-$&-$\'-')) //h-h-e-llo-llo
replace的第二個引數也可以作為一個函式,將每一個正則匹配內容替換為函式的回傳值
函式可以接受多個引數,第一個為匹配到的內容,后面為組匹配內容(可以有多個組匹配),倒數第二個引數為匹配內容再字串中的位置,倒數第一個引數為原字串,
console.log('hello'.replace(/e/, function (match, index, str) {
console.log(match, index, str)
return '?'
}))
//e 1 hello
//h?llo
split()
使用正則運算式或者一個固定字串分割一個字串,并將分割后的子字串存盤到陣列中
該方法可接受兩個引數,第一個引數為正則運算式,表示分割規則,第二個引數是回傳陣列的最大成員數
str = 'ni hao ya.hei hei hei'
str.split(/ |\./, 5) //[ 'ni', 'hao', 'ya', 'hei', 'hei' ]
總結:
判斷字串是否被匹配到,使用test或者search方法
想獲得更多的資訊,使用exec或者,match方法,會比較慢,
修飾符(標志符)
修飾符表示附加規則,放在正則模式的最尾部,可以單個使用,也可以一起使用,
//單個修飾符
'abAbab'.match(/a/g) //["a","a"]
//多個修飾符一起使用
'abAbab'.match(/a/gi) //["a", "A", "a"]
g修飾符
全域搜索,默認情況下只匹配一次,就停止像下匹配了,加上修飾符會一直向下搜索
i修飾符
默認情況下會區分匹配字串的大小寫情況
m修飾符
多行搜索,多行模式,會修改
^和$的行為
默認情況下,^和$匹配字串的開始處和結尾處
加上m修飾符,^和$還會匹配行首和行尾,即^和$會識別換行符\n
例如:
/yewen$/m.test('hi yuwen\n')為true/yewen$/.test('hi yuwen\n')為false
s修飾符
允許
.匹配換行符
u修飾符
使用
unicode碼的模式進行匹配
y修飾符
執行 粘性搜索匹配從目標字串的當前位置開始
特殊字符
\字符
轉義字符
正則運算式中需要匹配特殊字符本身,需要再前面家反斜杠\
正則運算式中,需要反斜杠轉義的:^,.,[,$,(,),|,*,+,?,{,\
^字符
匹配開始位置
如果設定多行標志,那么也匹配換行符后的位置
例如:/^A/會匹配 "Ant"中的A,但是不會匹配"ntA"中的A
$字符
匹配結束位置
如果設定多行標志,那么也匹配換行符前的位置
例如:/A$/會匹配 "ntA"中的A,但是不會匹配"Ant"中的A
*字符
匹配一個運算式0次或多次
等價于{0, }
例如:/yueno*/會匹配 "yuenoooyuen"中的yuenooo和yuen
+字符
匹配一個運算式1次或多次
等價于{1, }
例如:/yueno+/只會匹配 "yuenoooyuen"中的yuenooo
?字符
匹配一個運算式0次或1次
等價于{0, 1}
- 例如:
/yueno?/只會匹配"yuenoooyuen"中的yueno - 注意:
?如果緊跟再任何量詞*、+、?或{}的后面,將會使量詞變得非貪婪(匹配盡量少的字符) - 例如:
/yueno??/只會匹配"yuenoooyuen"中的yuen
.字符
默認匹配出換行符之外的任何單個字符
- 例如:
/.y/只會匹配"yuenoooyuen"中的oy - 例如:
/..y/只會匹配"yuenoooyuen"中的ooy
(x)字符
捕獲括號
正則運算式中的括號表示分組匹配,括號中的模式可以用匹配分組的內容
分組匹配可以使用\n
正則替換中,可以使用$1,$2語法
- 例如:
/(wenbo)+/.test('wenbowenbo')為true,表示匹配wenbo整體一次或多次 - 例如:
"wenbo,zhijian".replace(/(wenbo),(zhijian)/, '$2,$1') - 輸出:
zhijian,wenbo
(?=x)字符
匹配
X但是不記住匹配項
非捕獲括號,使你能夠定義與正則運算式運算子一起使用的子運算式
使用非捕獲括號,能匹配元素,但是不能在使用\n和$n方法
x(?=y)字符
匹配>
x,僅僅當>x后面是>y> ,先行斷言
- 例如:
'wenbo'.match(/wen(?=bo)/) - 輸出:
[ 'wen', index: 0, input: 'wenbo', groups: undefined ] - 例如:
'wenyu'.match(/wen(?=bo)/) - 輸出:null
(?<=y)x字符
匹配>
x,僅僅當>x前面是>y,> 后行斷言
- 例如:
'wenbo'.match(/(?<=wen)bo/) - 輸出:
[ 'bo', index: 3, input: 'wenbo', groups: undefined ] - 例如:
'yubo'.match(/(?<=wen)bo/) - 輸出:null
x(?!y)字符
匹配>
x,僅僅當>x后面不是>y時,> 正向否定查找
(?<=y)x字符
匹配>
x,僅僅當>x前面不是>y> ,反向否定查找
x|y字符
匹配>
x或者>y可以連用
- 例如:
'wenyu'.match(/w|e|n/g) - 輸出:
[ 'w', 'e', 'n' ]
{n}字符
匹配前面一個字符剛好出現>
n次,>n> 是一個正整數
- 例如:
'hello'.match(/l{2}/g) - 輸出:
[ 'll' ]
{n,}字符
匹配一個字符至少出現了>
n次,>n> 是一個正整數
{n,m}字符
匹配前面的字符至少>
n> 次最多>m> 次,>n> ,>m是> 為正整數>
[xyz]字符
字符集合> 匹配方括號中的任意字符,包括轉義字符,可以使用破折號(-)制定一個字符,> 例如:>
[a-zA-Z1-9]>
- 例如:
'hello 123'.match(/[a-h1-2]/g) - 輸出:
[ 'h', 'e', '1', '2' ]
[^xyz]字符
反向字符集,> 匹配任何沒有包含再方括號中的字符
- 例如:
'hello 123'.match(/[^a-h1-2]/g) - 輸出:
[ 'l', 'l', 'o', '3' ]
[\b]字符
匹配一個退格(U+0008),不是>
\b,不要弄混了
\b字符
匹配一個詞的邊界
例如:
/\bworld/.test('hello world') // true/\bworld/.test('hello-world') // true/\bworld/.test('helloworld') // false
\B字符
匹配一個非單詞邊界
例如:
/\bworld/.test('hello world') // false/\bworld/.test('hello-world') // false/\bworld/.test('helloworld') // true
\cX字符
當X是出于A到Z之間字符的時候,匹配字串中的一個控制符
\d字符
匹配一個數字,等價于>
[0-9]
\D字符
匹配一個數字,等價于>
[^0-9]
\D字符
匹配一個數字,等價于>
[^0-9]
\f字符
匹配一個換頁符(U+000C)
\n字符
匹配一個換行符(U+000A)
\r字符
匹配一個回車符
\s字符
匹配一個空白字符,包括空格,制表符,換頁符,和換行符
[\f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
\S字符
匹配一個非空白字符
\t字符
匹配一個水平制表符
\v字符
匹配一個垂直制表符
\w字符
匹配一個單字字符(字母,數字或者下劃線)> ,等價于>
[A-Za-z0-9_]
\w字符
匹配一個非單字字符> ,等價于>
[A-Za-z0-9_]
\W字符
匹配一個非單字字符
\n字符
回傳最后的第n個字捕獲匹配的子字符,> 捕獲的數目以左括號計算
\0字符
匹配NULL字符(U+0000)
\xhh字符
匹配一個兩位十六進制數表示的字符(\x00-\xFF)
\uhhhh字符
匹配一個四位十六進制數表示的UTF-16代碼單元
\u{hhhhh}字符或\u{hhhh}
(僅當設定了U標志時)匹配一個十六進制時候表示的Unicode字符
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/276594.html
標籤:JavaScript
