一個提高效率的工具,正則表示式,值得學習一下!
前言
之前分享過幾篇工具系列的文章,受到不少讀者喜歡
今天再分享一個關於提高工作效率的工具:正則表示式
在工作中一般使用正則表示式來匹配,替換,檢索文字,可以大大提高了工作效率
文章首發在公眾號(月伴飛魚),之後同步到個人網站:xiaoflyfish.cn/
覺得有收穫,希望幫忙點贊,轉發下哈,謝謝,謝謝
簡介
正則表示式,又稱規則表示式,通常被用來檢索、替換那些符合某個模式(規則)的文字。
許多程式設計語言都支援利用正則表示式進行字串操作。例如,在Perl中就內建了一個功能強大的正則表示式引擎。
學會使用正則表示式可以極大提高我們文字處理效率,並且各大作業系統、程式語言、文字編輯器都已經支援正則表示式
線上正則測試工具:http://regex101.com/r/PnzZ4k/1
下面的例子我會使用Sublime Text(對了,這個工具也非常好用)實現
元字元
一般普通字元表示的還是原來的意思,比如字元 e
舉例:
所謂元字元(*Metacharacter*)就是指那些在正則表示式中具有特殊意義的專用字元
特殊單字元
舉例1:
舉例2:
空白符
舉例:
s 能匹配上各種空白符號,也可以匹配上空格
量詞
舉例1:
舉例2:
範圍
舉例:
貪婪、非貪婪與獨佔
正則有三種模式:貪婪匹配、非貪婪匹配和獨佔模式
- 貪婪匹配:在正則中,表示次數的量詞預設是貪婪的,在貪婪模式下,會嘗試儘可能最大長度去匹配。
- 非貪婪匹配:找出長度最小且滿足要求的,量詞後面要加上英文的問號(
?
),正則就變成了a*?
。
舉個例子1:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-QJa16VsU-1649431909060)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]
匹配結果是:"aaa",""
為什麼會匹配到空字串?
因為星號(*)代表0到多次。
舉個例子2:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-KWbarrs4-1649431909060)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]
獨佔模式:
不管是貪婪模式,還是非貪婪模式,都需要發生回溯才能完成相應的功能。
但是在一些場景下,我們不需要回溯,匹配不上返回失敗就好了,因此正則中還有另外一種模式,獨佔模式,它類似貪婪匹配,但匹配過程不會發生回溯,因此在一些場合下效能會更好。
什麼是回溯?
例如下面的正則:
regex = “xy{1,3}z”
text = “xyyz”
在匹配時,y{1,3}會盡可能長地去匹配,當匹配完 xyy 後,由於 y 要儘可能匹配最長,即三個,但字串中後面是個 z 就會導致匹配不上,這時候正則就會向前回溯,吐出當前字元 z,接著用正則中的 z 去匹配
分組與引用
舉個例子:
假設我們現在要去查詢15位或18位數字。
根據前面學習的知識,使用量詞可以表示出現次數,使用管道符號可以表示多個選擇,你應該很快就能寫出d15}d{18。
但經過測試,你會發現,這個正則並不能很好地完成任務,因為18位數字也會匹配上前15位
沒有匹配到18位的記錄
解決方式
可以用括號括起來表示一個整體
替換舉例
替換後:
匹配模式
常見的匹配模式有4種,分別是不區分大小寫模式、點號通配模式、多行模式和註釋模式
不區分大小寫模式
使用模式修飾符:放在整個正則前面時,表示匹配模式
點號通配模式
點號它可以匹配上任何符號,但不能匹配換行,如何匹配真正的“任意”符號
多行匹配模式
多行模式的作用在於,使 ^ 和 $ 能匹配上每行的開頭或結尾,我們可以使用模式修飾符號 (?m) 來指定這個模式
註釋模式
為正則添加註釋
斷言
斷言是指對匹配到的文字位置有要求。
通過一些例子來講解。
你應該知道 d{11} 能匹配上11位數字,但這11位數字可能是18位身份證號中的一部分。再比如,去查詢一個單詞,我們要查詢 tom,但其它的單詞,比如 tomorrow 中也包含了tom
單詞邊界
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-xpoFsApf-1649431909066)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]
環視
舉例郵政編碼的判斷:6位數字,且左邊不是數字,右邊不是數字
最後
覺得有收穫,希望幫忙點贊,轉發下哈,謝謝,謝謝
微信搜尋:月伴飛魚,交個朋友,進面試交流群
參考資料:
- 極客時間:正則表示式入門課
- 分散式系列第一彈:分散式一致性!
- 關於併發程式設計,你必須要知道的Future機制!
- 動態代理總結,面試你要知道的都在這裡,無廢話!
- 計算機網路常用知識總結!
- 京東面試題:ElasticSearch深度分頁解決方案!
- 社招一年半面經分享(含阿里美團頭條京東滴滴)
- Redis如何解決頻繁的命令往返造成的效能瓶頸!
- Spring奇技淫巧之擴充套件點的應用!
- 常用的Lambda表示式案例解析,工作中都會用到!
- 分享幾個工作中實用的程式碼優化技巧!
- 一個提高效率的工具,正則表示式,值得學習一下!
- 實現非同步程式設計,這個工具類你得掌握!
- 如何實現一個優秀的散列表!
- 分享幾個實用的IDEA外掛,提高你的工作效率!
- Switch竟然會報空指標異常,學到了!
- 記一次集合去重導致的線上問題
- 條件語句的多層巢狀問題優化,助你寫出不讓同事吐槽的程式碼
- 最完整的Explain總結,SQL優化不再困難!
- 高效能無鎖併發框架Disruptor,太強了!
- 在日常工作中怎麼做MySQL優化的?