正則表達(dá)式 入門
本文公眾號(hào)來源:月伴飛魚
作者:日常加油站
簡(jiǎn)介
正則表達(dá)式,又稱規(guī)則表達(dá)式,通常被用來檢索、替換那些符合某個(gè)模式(規(guī)則)的文本。
許多程序設(shè)計(jì)語言都支持利用正則表達(dá)式進(jìn)行字符串操作。例如,在Perl中就內(nèi)建了一個(gè)功能強(qiáng)大的正則表達(dá)式引擎。
學(xué)會(huì)使用正則表達(dá)式可以極大提高我們文本處理效率,并且各大操作系統(tǒng)、編程語言、文本編輯器都已經(jīng)支持正則表達(dá)式
在線正則測(cè)試工具:https://regex101.com/r/PnzZ4k/1
下面的例子我會(huì)使用Sublime Text(對(duì)了,這個(gè)工具也非常好用)實(shí)現(xiàn)
元字符
一般普通字符表示的還是原來的意思,比如字符 e
舉例:
所謂元字符(Metacharacter)就是指那些在正則表達(dá)式中具有特殊意義的專用字符
特殊單字符
舉例1:
舉例2:
空白符
舉例:
s 能匹配上各種空白符號(hào),也可以匹配上空格
量詞
舉例1:
舉例2:
范圍
舉例:
貪婪、非貪婪與獨(dú)占
正則有三種模式:貪婪匹配、非貪婪匹配和獨(dú)占模式
-
貪婪匹配:在正則中,表示次數(shù)的量詞默認(rèn)是貪婪的,在貪婪模式下,會(huì)嘗試盡可能最大長(zhǎng)度去匹配。
-
非貪婪匹配:找出長(zhǎng)度最小且滿足要求的,量詞后面要加上英文的問號(hào)(
?),正則就變成了a*?。
舉個(gè)例子1:
匹配結(jié)果是:"aaa",""
為什么會(huì)匹配到空字符串?
因?yàn)樾翘?hào)(*)代表0到多次。
舉個(gè)例子2:
獨(dú)占模式:
不管是貪婪模式,還是非貪婪模式,都需要發(fā)生回溯才能完成相應(yīng)的功能。
但是在一些場(chǎng)景下,我們不需要回溯,匹配不上返回失敗就好了,因此正則中還有另外一種模式,獨(dú)占模式,它類似貪婪匹配,但匹配過程不會(huì)發(fā)生回溯,因此在一些場(chǎng)合下性能會(huì)更好。
什么是回溯?
例如下面的正則:
regex = “xy{1,3}z”
text = “xyyz”
在匹配時(shí),y{1,3}會(huì)盡可能長(zhǎng)地去匹配,當(dāng)匹配完 xyy 后,由于 y 要盡可能匹配最長(zhǎng),即三個(gè),但字符串中后面是個(gè) z 就會(huì)導(dǎo)致匹配不上,這時(shí)候正則就會(huì)向前回溯,吐出當(dāng)前字符 z,接著用正則中的 z 去匹配
分組與引用
舉個(gè)例子:
假設(shè)我們現(xiàn)在要去查找15位或18位數(shù)字。
根據(jù)前面學(xué)習(xí)的知識(shí),使用量詞可以表示出現(xiàn)次數(shù),使用管道符號(hào)可以表示多個(gè)選擇,你應(yīng)該很快就能寫出d15}。
但經(jīng)過測(cè)試,你會(huì)發(fā)現(xiàn),這個(gè)正則并不能很好地完成任務(wù),因?yàn)?8位數(shù)字也會(huì)匹配上前15位
沒有匹配到18位的記錄
解決方式
可以用括號(hào)括起來表示一個(gè)整體
替換舉例
替換后:
匹配模式
常見的匹配模式有4種,分別是不區(qū)分大小寫模式、點(diǎn)號(hào)通配模式、多行模式和注釋模式
不區(qū)分大小寫模式
**使用模式修飾符:**放在整個(gè)正則前面時(shí),表示匹配模式
點(diǎn)號(hào)通配模式
點(diǎn)號(hào)它可以匹配上任何符號(hào),但不能匹配換行,如何匹配真正的“任意”符號(hào)
多行匹配模式
多行模式的作用在于,使 ^ 和 $ 能匹配上每行的開頭或結(jié)尾,我們可以使用模式修飾符號(hào) (?m) 來指定這個(gè)模式
注釋模式
為正則添加注釋
斷言
斷言是指對(duì)匹配到的文本位置有要求。
通過一些例子來講解。
你應(yīng)該知道 d{11} 能匹配上11位數(shù)字,但這11位數(shù)字可能是18位身份證號(hào)中的一部分。再比如,去查找一個(gè)單詞,我們要查找 tom,但其它的單詞,比如 tomorrow 中也包含了tom
單詞邊界
環(huán)視
舉例郵政編碼的判斷:6位數(shù)字,且左邊不是數(shù)字,右邊不是數(shù)字
《對(duì)線面試官》系列目前已經(jīng)連載28篇啦,這是一個(gè)講人話面試系列
-
【對(duì)線面試官】Java注解 -
【對(duì)線面試官】Java泛型 -
【對(duì)線面試官】 Java NIO -
【對(duì)線面試官】Java反射 && 動(dòng)態(tài)代理 -
【對(duì)線面試官】多線程基礎(chǔ) -
【對(duì)線面試官】 CAS -
【對(duì)線面試官】synchronized -
【對(duì)線面試官】AQS&&ReentrantLock -
【對(duì)線面試官】線程池 -
【對(duì)線面試官】ThreadLocal -
【對(duì)線面試官】CountDownLatch和CyclicBarrier -
【對(duì)線面試官】為什么需要Java內(nèi)存模型? -
【對(duì)線面試官】深入淺出 Java 內(nèi)存模型 -
【對(duì)線面試官】Java從編譯到執(zhí)行,發(fā)生了什么? -
【對(duì)線面試官】雙親委派機(jī)制 -
【對(duì)線面試官】List -
【對(duì)線面試官】Map -
【對(duì)線面試官】SpringMVC -
【對(duì)線面試官】Spring基礎(chǔ) -
【對(duì)線面試官】SpringBean生命周期 -
【對(duì)線面試官】Redis基礎(chǔ) -
【對(duì)線面試官】Redis持久化 -
【對(duì)線面試官】Kafka基礎(chǔ) -
【對(duì)線面試官】使用Kafka會(huì)考慮什么問題? -
【對(duì)線面試官】MySQL索引 -
【對(duì)線面試官】MySQL 事務(wù)&&鎖機(jī)制&&MVCC -
【對(duì)線面試官】MySQL調(diào)優(yōu)
掃碼關(guān)注【面試造火箭】
