正規表示式廣泛用於查詢、校驗,無論使用什麼語言開發,或者是日常工作中使用編輯器,掌握正規表示式都能帶來效率上的收穫。
我在別人的教程中看過一句話:「如果你覺得正規表示式很簡單,要麼你是乙個天才,要麼你不是地球人。」
不要被嚇到,一旦理解正則後,其實也並不會那麼難,而且它給我們帶來的好處是毋庸置疑的。本文盡量用通俗易懂的語言將正則的規則描述清楚。
^
和$
分別匹配開始和結束,常見的正規表示式通常包含了^
和$
,並不是說正規表示式本身必須包含這兩個標識,而是說「從頭到尾匹配整個字串」。
正則的目的是以規則匹配字串,而正規表示式本身也是字串,就要用占用部分字元或字串來進行規則描述,元字元和限定符就屬於規則描述的一部分。
規則「10個數字」中,我們將「10個」理解為限定符,將「數字」理解為元字元。
手機號碼的正則^1\d$
描述的規則是:「以『1』開頭,後面跟10個數字」。其中\d
表示「數字」,表示「10個」
元字元說明
.匹配除換行符以外的任意字元
\w匹配字母或數字或下劃線或漢字
\s匹配任意的空白符
\d匹配數字
\b匹配單詞的開始或結束
^匹配字串的開始
$匹配字串的結束
限定符說明
*重複零次或更多次
+重複一次或更多次
?重複零次或一次
重複n次
重複n次或更多次
重複n到m次
由於元字元和限定符本身也是字串,所以當我們要匹配乙個問號,必須進行轉移,否則會將「?」當成限定字元。於是匹配問號必須進行轉移,正則中轉義符為:\
如匹配問號用\?
;匹配轉義字元本身用\\
**/語法
說明\w
匹配任意不是字母,數字,下劃線,漢字的字元
\s匹配任意不是空白符的字元
\d匹配任意非數字的字元
\b匹配不是單詞開頭或結束的位置
[^帥]
匹配除了「帥」以外的任意字元
[^帥氣]
匹配除了「帥氣」這幾個字母以外的任意字元
從上表可以看出^
符號有取反的意思,但要放在以內,否則會被當成匹配開始。
注意,只要中以
^
開頭,將對整個中的內容取反
|
表示邏輯或,即多個條件只需要滿足乙個,不過多描述。
簡單的將ipv4正則可寫為^(\d\.)\d$
。
按步驟理解:
\d
表示1至3位數字
\d\.
表示1至3位數字後面跟乙個點
(\d\.)
表示1至3位數字後面跟乙個點,重複3次
最後再加乙個\d
以上正則可以簡單的描述正規表示式的規則,但有乙個問題:ip位址的區間應該是「0.0.0.0」到「255.255.255.255」,而以上正規表示式會匹配「300.556.900.650」這種錯誤的ip位址,因此我們需要將ipv4正規表示式進行修改。
但由於正則是匹配字串的,無法直接提供0-255的數字大小區間,於是我們只能自己對其進行拆分。
按步驟分析:
描述250-255的規則:25[0-5]
描述200-249的規則:2[0-4]\d
描述100-199的規則:1\d
描述0-99的規則:[1-9]?\d
將以上四步的規則進行|
拼接,然後加上點\.
於是得出^((25[0-5]|2[0-4]\d|((1\d)|([1-9]?\d)))\.)(25[0-5]|2[0-4]\d|((1\d)|([1-9]?\d)))$
使用go語言測試以上正則:
package main
import (
"fmt"
"regexp"
)var exp= regexp.mustcompile("^帥氣")
var expipv4= regexp.mustcompile(`^((25[0-5]|2[0-4]\d|((1\d)|([1-9]?\d)))\.)(25[0-5]|2[0-4]\d|((1\d)|([1-9]?\d)))$`)
func main()
輸出結果:
true
false
true
false
輕鬆學習正規表示式
英文原文 learn regular expressions regex with ease 謝謝合作!譯文如下 開篇,談談本文的主要內容 編寫驗證規則最流行和最簡單的方法就是正規表示式了,但唯一的乙個問題是正規表示式的語法太隱晦了,讓人蛋疼無比。很多開發者為了在專案中應用複雜的驗證,經常要使用一些...
輕鬆學習正規表示式
正規表示式 regular expression 描述了一種字串匹配的模式,可以用來檢查乙個串是否含有某種子串 將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。列目錄時,dir txt或ls txt中的 txt就不是乙個正規表示式,因為這裡 與正則式的 的含義是不同的。正規表示式是由普通字...
輕鬆學習正規表示式
也許你是初學者,那以防萬一,我先來講講什麼是正規表示式吧 正規表示式可以幫助我們更好的描述複雜的文字格式。一旦你描述清楚了這些格式,那你就可以利用它們對文字資料進行檢索 替換 提取和修改操作。下面有乙個正規表示式的簡單例子。第一步先要引入有關正則式的命名空間 using system.text.re...