前言
? ? 雖然工作四五年了,都沒怎么使用過正則,但是它一直都是我心中的一個(gè)痛,尤其是我月初手寫webpack-loader完成項(xiàng)目需求時(shí),使用了大量的字符串的find、replace等操作,這讓我再一次存在這樣的疑問:如果是正則,會(huì)不會(huì)更好?
元字符
? ??^、$、.、*、+、?、|、\、/、(、)、[、]、{、}、=、!、:、-
橫向匹配與縱向匹配
? ? 橫向匹配
? ? ? ? 一般字符值是確定的,但是該字符出現(xiàn)的個(gè)數(shù)不確定,比如ab、abb、abbb、abbb...b中,b出現(xiàn)的次數(shù)不確定
? ? ? ? 代表字符:
? ? ? ? ? ? {}:具體指定出現(xiàn)次數(shù)
? ? ? ? ? ? ?:0|1次
? ? ? ? ? ? +:>=1次
? ? ? ? ? ? *:>=0次
? ??縱向匹配
? ? ? ? 一般針對(duì)某一個(gè)字符做限定,如ab、ac、ad、af中,b的值不確定
? ? ? ? 代表字符:
? ? ? ? ? ? .:通配符,表任意字符
? ? ? ? ? ? -:范圍
? ? ? ? ? ? []:具體指定可選值
? ? ? ? ? ? ^:排除(僅用在[]時(shí))
? ? ? ? ? ? \d:數(shù)字
? ? ? ? ? ? \w:數(shù)字|字母|下劃線
? ? ? ? ? ? \s:空白符,如空格、水平制表符、垂直制表符、換行符、回車符、換頁(yè)符等
? ? ? ? ? ? \D|\W|\S:上述小寫取反
貪婪與惰性
? ? 貪婪
? ? ? ? 按最大范圍匹配
? ? 惰性
? ? ? ? 按最小范圍匹配,使用?標(biāo)識(shí)
分支
? ? 標(biāo)識(shí)符
????????|
? ? ? ? 一般與()搭配使用
修飾符
? ? g:后一次匹配從上一次匹配成功的下一個(gè)位置開始
? ? m:多行匹配
? ? i:忽略大小寫
優(yōu)先級(jí)
? ? \?()或[]?
?{}或*或?或+?
?^或$或字符字面量?
?|
示例
? ??取任意字符
? ? ? ? [^]
? ??取除了abc外的
? ? ? ? [-ac]
? ??匹配十六進(jìn)制顏色值
? ? ? ? 分析:
? ? ? ? ? ? 十六進(jìn)制以“#”開頭,但是并不能使用^,因?yàn)檫@代表整個(gè)字符的開頭
? ? ? ? ? ? 除了#外,其余字符為數(shù)字和字母,但是下劃線不行,故為[\da-fA-F],且需要使用()與#隔開
? ? ? ? ? ? 顏色值可以是3位也可以是6位,故需要使用分支:|? ? ?
? ? ????結(jié)果:
? ??配送時(shí)間--24小時(shí)制
? ? ? ? 分析:
? ? ? ? ? ? 若時(shí)的十位為2時(shí),時(shí)的個(gè)位只能為0、1、2、3
? ? ? ? ? ? 分的十位最高取到6
? ? ? ? ? ? 涉及兩種情況,需要使用|+()
? ? ????結(jié)果:
? ??匹配日期
? ? ? ? 分析:
? ? ? ? ? ? 和時(shí)間一樣,主要分析出分支
? ? ? ? ? ? [0-38]代表的是0、1、2、3和8,而不是0到38
? ? ????結(jié)果:
? ??匹配文件路徑
? ? ? ? 分析:
? ? ? ? ? ? 盤符可以是任意的大小寫字母,對(duì)于冒號(hào)而言,我不確定需不需要轉(zhuǎn)譯,那就轉(zhuǎn)譯準(zhǔn)沒錯(cuò)
? ? ? ? ? ? 剩下的文件夾,分兩種情況:
? ? ? ? ? ? ? ? 如果是最后一個(gè),則沒有\(zhòng),且要么有要么沒有
? ? ? ? ? ? ? ? 如果不是最后一個(gè),則一定有\(zhòng),且為0或多個(gè)
? ? ? ? ? ? ? ? 雖說是兩種情況,但這里并不是分支的概念
? ? ????結(jié)果:
? ??匹配id
? ? ? ? 分析:
? ? ? ? ? ? 使用.可以匹配任意字符,為空的不要,故為.+
? ? ? ? ? ? 但是.也會(huì)匹配引號(hào),故想要進(jìn)行貪婪,匹配到右引號(hào)即停止
? ? ? ? ? ? ?是對(duì)匹配結(jié)果進(jìn)行貪婪,而非前一個(gè),如.+?“標(biāo)識(shí)對(duì)任意字符匹配到問號(hào)為止,而不是對(duì)+
? ? ? ? ?結(jié)果: