正則表達(dá)式基本常識(shí)
常用運(yùn)算符與表達(dá)式
1.^ 開始荐捻,從頭開始匹配
2.() 域段
3.[] 包含,默認(rèn)是一個(gè)字符長(zhǎng)度
4.[^] 不包含,默認(rèn)是一個(gè)字符長(zhǎng)度
5.{n,m} 匹配長(zhǎng)度
6..任何單個(gè)字符(. 字符點(diǎn))
7.| 或
8.\ 轉(zhuǎn)義
9.$ 結(jié)尾,從最后還是匹配
10.[A-Z] 26個(gè)大寫字母
11.[a-z] 26個(gè)小寫字母
12.[0-9] 0至9數(shù)字
13.[A-Za-z0-9] 26個(gè)大寫字母、26個(gè)小寫字母和0至9數(shù)字
等價(jià)
等價(jià)是等同于的意思硫痰,表示同樣的功能吸耿,用不同符號(hào)來書寫氓癌。
?,,+,\d,\w 都是等價(jià)字符
1.?等價(jià)于匹配長(zhǎng)度{0,1}
2.等價(jià)于匹配長(zhǎng)度{0,}
3.+等價(jià)于匹配長(zhǎng)度{1,}
4.\d等價(jià)于[0-9]
5.\D等價(jià)于[^0-9]
6.\w等價(jià)于[A-Za-z_0-9]
7.\W等價(jià)于[^A-Za-z_0-9]
簡(jiǎn)單運(yùn)用
0-10000正整數(shù) : /^(0|[1-9]\d{0,3}|10000)$/
0-10內(nèi)所有實(shí)數(shù)包括2位小數(shù) :/[0-9](\.\d{1,2})?|10$/
手機(jī)號(hào)正則 : /^1[34578][0-9]{9}$/
單詞邊界 : /\bis\b/
修飾符(三個(gè) g 绒障、i、m)
g:global 執(zhí)行一個(gè)全局匹配
i:ignore case執(zhí)行一個(gè)不區(qū)分大小寫的匹配
m: multiple lines多行匹配
有g(shù)和沒有g(shù)的區(qū)別
有i和沒有i的區(qū)別
分組/獲取匹配/非獲取匹配/預(yù)查
不分組 : /abc{2}/
分組 : /(abc){2}/
獲取匹配(pattern):
匹配pattern并獲取這一匹配酝碳。所獲取的匹配可以從產(chǎn)生的Matches集合得到矾踱,在JavaScript中則使用$1…$9屬性。
非獲取匹配(?:pattern):
非獲取匹配疏哗,匹配pattern但不獲取匹配結(jié)果呛讲,不進(jìn)行存儲(chǔ)供以后使用。
正向肯定預(yù)查(?=pattern)和正向否定預(yù)查(?!pattern)
反向肯定預(yù)查(?<=pattern)和反向否定預(yù)查(?<!pattern)
(?=pattern):非獲取匹配返奉,正向肯定預(yù)查贝搁,在任何匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以后使用衡瓶。例如徘公,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”哮针。
(?!pattern):非獲取匹配关面,正向否定預(yù)查,在任何不匹配pattern的字符串開始處匹配查找字符串十厢,該匹配不需要獲取供以后使用等太。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”蛮放。
(?<=pattern):非獲取匹配缩抡,反向肯定預(yù)查,與正向肯定預(yù)查類似包颁,只是方向相反瞻想。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”娩嚼,但不能匹配“3.1Windows”中的“Windows”蘑险。
(?<!patte_n):非獲取匹配,反向否定預(yù)查岳悟,與正向否定預(yù)查類似佃迄,只是方向相反泼差。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”呵俏。
公式總結(jié):
(?=pattern): exp1(?= exp2) 查找exp2前面的exp1
(?<=pattern): (?<= exp2)exp1 查找exp2后面的exp1
(?!pattern): exp1(?! exp2) 查找后面不是exp2的exp1
(?<!pattern): (?<! exp2)exp1 查找前面不是exp2的exp1
舉例:變?yōu)榍Х治坏恼齽t:
"1234567890".replace(/\B(?=(?:\d{3})+(?!\d))/g,",")
拆分
/\B(?=(?:\d{3})+(?!\d))/ -> exp1(?=exp2)
exp1 = \B ,?= exp2 = ?=((?:\d{3})+(?!\d)) -> exp1(?!exp2)
exp1 = (?:\d{3})+ ,?!exp2 = ?!\d, exp1 -> \d{3}+
(?!\d) //最后一位不是正整數(shù)的\d{3}
\d{3} : 1(234)(567)(890)
exp1(?=exp2): \B(?=exp2) //exp2的前一位不是占位符的值
1,(234),(567),(890)
-> 1,234,567,890
在上列正則表達(dá)中 (?!\d ) 目的 與 $相同堆缘,可簡(jiǎn)化為
"1234567890".replace(/\B(?=(\d{3})+$)/g,",")
結(jié)合場(chǎng)景運(yùn)用正則
下列為一個(gè)遍歷樹節(jié)點(diǎn)的text值的正則實(shí)現(xiàn)
//遞歸
function mapTreeByLoop(data) {
for (let i = 0; i < data.length; i++) {
// data[i].label = data[i].text
console.log(data[i].text)
if (data[i].children && data[i].children.length > 0) {
mapTreeByLoop(data[i].children)
}
}
}
//正則
function mapTreeByrReg(data) {
const str = JSON.stringify(data)
const addStr = str.match(/(?<="text":")[^"]*/g)
for (let i = 0; i < addStr.length; i++) {
console.log(addStr[i])
}
}
//打印運(yùn)算時(shí)間
function startTimeFunc(data) {
console.time("time")
// renderTreeFunc(data)
regFunc(data)
console.timeEnd("time")
}
對(duì)正則運(yùn)算和 遞歸循環(huán)運(yùn)算的時(shí)間進(jìn)行比較
使用正則的運(yùn)算時(shí)間在16ms左右,而使用遞歸的時(shí)間在29ms普碎,正則的運(yùn)算穩(wěn)定比遞歸運(yùn)算高效吼肥。
以上為我學(xué)習(xí)時(shí)整理,個(gè)人認(rèn)為上述用法全都掌握,善加運(yùn)用應(yīng)該絕大部分情況下需要用到的正則都可以妥妥實(shí)現(xiàn)。