最簡單的單獨(dú)匹配一個(gè)單詞,如匹配blue.需要使用\b.它是元字符,代表著單詞的開頭或者結(jié)尾.只匹配一個(gè)位置.如匹配單詞blue的方法是\bblue\b.
一些元字符
- \b匹配一個(gè)位置
- .(這里是個(gè)點(diǎn),可能看不清)匹配除換行以外任意字符
- *表示重復(fù)零次或更多次
- \d匹配一個(gè)數(shù)字
- \s匹配任意的空白符,如空格,制表符,換行符
- \w匹配數(shù)字,字母,漢字,還有下劃線
- ^匹配字符串的開始,$匹配字符串的結(jié)尾
舉例
- \ba\w*\b匹配以a開頭的單詞(有可能是abc,a正則,a_g_)
- \d+匹配一個(gè)或者更多連續(xù)的數(shù)字
- \b\w{6}\b匹配剛好6個(gè)單詞的單詞
- ^\d{5,12}$匹配5到12位數(shù)字
重復(fù)的幾種表示方法
- *重復(fù)零或者任意更多次
- +重復(fù)一次或更多次
- ?零或者一次
- {n}重復(fù)n次
- {n,}n或者更多次
- {n,m}n到m次
方括號的使用[ ]
- [aeiou]匹配任何一個(gè)元音字母
- [.?!]匹配其中一個(gè)標(biāo)點(diǎn)符號
- [0-9]匹配一個(gè)數(shù)字
- [a-z 0-9 A-Z]
反義
- \W匹配任意非字母,非數(shù)字,非漢子,非下劃線的字符
- \S匹配除了空白符的字符
- \D匹配任意非數(shù)字的字符
- \B匹配不是單詞開頭或結(jié)尾的位置
- 在方括號里面使用^實(shí)現(xiàn)反義,[^a]匹配除了a以外的任意字符
分枝條件| 正則表達(dá)式里的替換指的是有幾種規(guī)則,如果滿足了其中一種規(guī)則都應(yīng)該當(dāng)成匹配
- 0\d{2}-\d{8}|0\d{3}-\d{7}匹配兩種以連字符分割的電話號碼
- \d{5}-\d{4}|\d{5}匹配美國的郵編,5位數(shù)字或者用連字號間隔的9位數(shù)字。
之所以給出這個(gè)例子,是要注意,使用分枝條件時(shí),順序很重要。從左到右測試條件,一旦滿足了某個(gè)條件,就不會去管后面的正則了。如果換成\d{5}|\d{5}-\d{4},用這個(gè)去匹配時(shí),只能匹配到5位數(shù)字,或者9位數(shù)字的前五位
后向引用
還記得前面分組用的小括號嗎?后向引用就是給小括號編上號,從左到右依次為1,2...
- \b(\w+)\b\s+\1\b這里的\1匹配前面的單詞
- 可以給子表達(dá)式自定義名字,使用?<name>例如?<word>\w+調(diào)用的時(shí)候使用\k<word>
零寬斷言
- (?=exp) //匹配exp前面的位置
- \b\w+(?=ing\b)匹配以ing結(jié)尾的單詞前面的部分
- (?<=exp) //匹配exp后面的位置
- (?<=\bre)\w+\b //匹配以re開頭的單詞后面的部分
- (?!exp) //匹配后面跟的不是exp的位置
- \d{3}(?!\d) //匹配三位數(shù)字,而且三位數(shù)字后面不能是數(shù)字
- (?<!exp) //匹配前面跟的不是exp的位置
- (?<![a-z])\d{7}匹配前面不是小寫字母的七位數(shù)字
- 假如想要在一串很長的數(shù)字中每三位數(shù)字間加一個(gè)逗號,可以這樣來匹配位置((?=\d)\d{3})*\b
- 匹配以空白符間隔的數(shù)字(?<=\s)\d(?=\s)
貪婪與懶惰
- 默認(rèn)貪婪匹配,如a.*b用在aababb上的話,會匹配整個(gè)字符串
- 想要實(shí)現(xiàn)懶惰匹配,需要加上問號a.*?b這樣只會匹配aab
- *? 重復(fù)任意次,但盡可能少重復(fù)
- +? 重復(fù)1次或更多次,但盡可能少重復(fù)
- ?? 重復(fù)0次或1次,但盡可能少重復(fù)
- {n,m}? 重復(fù)n到m次,但盡可能少重復(fù)
- {n,}? 重復(fù)n次以上,但盡可能少重復(fù)