概念
正則表達式是用于匹配字符串中字符組合的模式。在 JavaScript中,正則表達式也是對象。這些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、matchAll、replace、search 和 split 方法。
創(chuàng)建正則表達式
兩種方法:字面量方式、構(gòu)造函數(shù)方式
//字面量方式,其由包含在斜杠之間的模式組成,如下所示:
var re = /ab+c/;
//構(gòu)造函數(shù)方式,調(diào)用RegExp對象的構(gòu)造函數(shù),如下所示:
var re = new RegExp("ab+c");
正則表達式常用方法
- 校驗數(shù)據(jù)
test(字符串)
測試字符是否滿足正則表達式規(guī)則,如果測試到有,則返回true;沒有則返回flase
語法:正則表達式.test(字符串) 正則表達式提供的方法
var reg=/[123]/
var str='1'
var result=reg.test(str)
console.log(result)//flase
search(正則表達式)
search() 方法執(zhí)行正則表達式和 String 對象之間的一個搜索匹配。
語法:字符串.search(正則表達式) 字符串提供的方法
var reg=/\d/ //匹配阿拉伯數(shù)字
var str="abcdefg3sgbh"
var res=str.search(reg)
console.log(res) //7
//驗證方法 找到返回下標 找不到返回-1
//在字符串中找到滿足正則表達式的那一部分
區(qū)別:
.test()方法是正則表達式提供的,.search()是字符串提高的,
.test()方法返回布爾值,search()返回下標
- 提取數(shù)據(jù)
正則表達式.exec(字符串)
exec() 方法在一個指定字符串中執(zhí)行一個搜索匹配。返回一個結(jié)果數(shù)組或 null。 正則表達式提供的方法
var reg=/\d/
var str="abcd456efg"
var res=reg.exec(str)
console.log(res)//返回一個數(shù)組,內(nèi)容是4
//字符串中滿足正則表達式的部分提取出來
//遇到滿足條件的就返回,所以只返回4
字符串.match(正則表達式)
match() 方法檢索返回一個字符串匹配正則表達式的結(jié)果。 字符串提供的方法
var reg=/\d/
var str="abcd456efg"
var res=str.match(reg) //字符串中滿足表達式的部分提取出來
console.log(res)
區(qū)別:
正則表達式.exec(字符串),正則表達式提供的方法
字符串.match(正則表達式) 字符串的方法
相同:
都返回一個數(shù)組,只要匹配到符合規(guī)則的數(shù)據(jù)就返回
- 替換數(shù)據(jù)
字符串.replace(正則表達式,新的內(nèi)容)
replace() 方法返回一個由替換值(replacement)替換部分或所有的模式(pattern)匹配項后的新字符串。模式可以是一個字符串或者一個正則表達式,替換值可以是一個字符串或者一個每次匹配都要調(diào)用的回調(diào)函數(shù)。如果pattern是字符串,則僅替換第一個匹配項。字符串提供的方法
var reg=/\d/
var str="11123bcd"
var res=str.replace(reg,"a") //將數(shù)字換為a
console.log(res)//a1123bcd 只要匹配到符合規(guī)則的就返回
斷言
范圍類
在[]組成的類內(nèi)部是可以連寫的
let text = 'a1B2d3X4Z5'
let reg=/[a-zA-Z]/
text.replace(reg,'Q')//Q1Q3Q4Q5
字符類
字符類取反
很多時候碰到這么一種情況,即不想匹配某些字符,其他都匹配。此時,可以使用字符類取反——使用元字符^,創(chuàng)建反向類,即不屬于某類的內(nèi)容。
[^abc]表示不是字符a或b或c的內(nèi)容
let reg=/[^abc]/g
let text='a1b2c3d4e5'
console.log(text.replace(reg,'X')) //輸出aXbXcXdXeX
修飾符
在正常情況下,正則匹配到第一個匹配項則停止,并且默認大小寫敏感,如果想修改默認選項,則需要修飾符。
g:global全文搜索
var reg=new RegExp('l');
var a='hello'.replace(reg,'f')
console.log(a)//輸出結(jié)果為:heflo
var reg=new RegExp('l','g');//加上g標簽表示全文搜索
var a='hello'.replace(reg,'f')
console.log(a)//輸出結(jié)果為:heffo (所有的 l 都換成了 f )
i:ignore case 忽略大小寫
var reg=new RegExp('l','g');
var a='helloHELLO'.replace(reg,'f')
console.log(a)//輸出結(jié)果為:heffoHELLO
var reg=new RegExp('l','gi');//加上i標簽表示忽略大小寫
var a='helloHELLO'.replace(reg,'f')
console.log(a)//輸出結(jié)果為:heffoHEffO (大寫和小寫的l都被替換了)
m:multiple lines 多行搜索
var reg=new RegExp('od')
var str='so good\n so good'
var result=str.replace(reg,'hi')
console.log(result)
//結(jié)果為:
so gohi
so good
//只給第一行匹配了
var reg=new RegExp('od','gm')//加上m標簽表示多行匹配
var str='so good\n so good'
var result=str.replace(reg,'hi')
console.log(result)
//結(jié)果為:
so gohi
so gohi
其他標志符
s:允許 . 匹配換行符。
u:使用unicode碼的模式進行匹配。
y:執(zhí)行“粘性(sticky)”搜索,匹配從目標字符串的當前位置開始。
量詞符
貪婪模式
之前說了正則表達式的量詞,但量詞會帶來一個到底匹配哪個的問題
例如:
var str="12345678"
var reg=/\d{3,6}/g
str.replace(reg,'X') //X78
可以看到結(jié)果是將123456 六個數(shù)字替換成了X,所以我們可以得到,正常模式下,正則表達式會盡可能多的匹配。正常情況下,正則表達式采用貪婪模式,即,盡可能多的匹配。
非貪婪模式
一但成功匹配不再繼續(xù)嘗試,這就是非貪婪模式。
只需要在量詞后加上?即可
var str="12345678"
var reg=/\d{3,6}?/g
str.replace(reg,'X') //X45678
分組
在使用正則表達式的時候會想要匹配一串字符串連續(xù)出現(xiàn)多次的情況,使用()可以達到分組的功能
例如:(hello){3}
使用符號 | (或)實現(xiàn)選擇的功能
例如:
var str='12341235'
let reg=/123(4|5)/g
//1234 1235二選一
反向引用
將一種格式的時間字符串:yyyy-MM-DD轉(zhuǎn)為MM/DD/yyyy類型格式字符串。
由于年月日是不固定的,沒法直接轉(zhuǎn)換為固定數(shù)值。這時我們可以使用反向引用解決這個問題。
利用$n,n代表著分組的序號,序號是從1開始的。文章來源:http://www.zghlxwxcb.cn/news/detail-400792.html
例如:文章來源地址http://www.zghlxwxcb.cn/news/detail-400792.html
let text='2022-02-23'
let reg=/(\d{4})-(\d{2})-(\d{2})/
let res=text.replace(reg,'$3/$2/$1')//將yyyy-MM-DD轉(zhuǎn)換為MM/DD/yyyy
console.log(res)
到了這里,關于JS——正則表達式(超詳細)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!