來源:https://zyqok.blog.csdn.net/?type=blog
案例引入
在講正則表達式前,我們不妨先從一個場景來逐漸引入。
你可能有過這樣的經歷:我們去某些網站註冊帳號,當你在設置密碼的時候,網站會提示你密碼的長度范圍,以及對應的規則限制(如下圖)。
根據上圖,我們將密碼設置規則可以描述為兩個條件:
(1)長度為6-16位;
(2)密碼中必須包含數字,大寫字母,小寫字母,特殊字符(指定字符);
現在假設我們不知道正則表達式,作為程序員的你,該如何去實現這樣一個密碼驗證呢?
下面是我寫的一個校驗方法(樣本):
這個方法寫得對不對呢?我們不防用幾組密碼去進行驗證下:
可以看到,我們列舉的8組密碼,都得到瞭驗證,說明我們的方法是OK的。
但這樣一個密碼設置規則校驗,我們就差不多寫近 30 行的代碼,是不是感覺有點累贅瞭呢?明明規則很簡單,代碼量卻寫瞭這麼多,有沒有什麼方法可以簡化我們的代碼呢?當然有!於是,這時就可以讓我們今天的主角正則表達式出場瞭。
下面,則是具有相同校驗功能,基於正則表達式的驗證方法:
那麼它寫得到底對不對呢?於是,我們可以通過上面的示例數據,繼續調用該方法來進行驗證:
通過結果我們可以看到,他也是符合我們預期的。於是我們發現,在不用正則表達式的時候,我們的代碼量近30行,而使用瞭正則表達式,代碼就濃縮為瞭1行,也就是說,使用正則表達式時可以簡化我們的代碼。
但同時我們也可知,正則表達式具有一定的學習成本,如果你不懂正則表達式,那麼你看它可能就是一頭霧水,如果出瞭問題,更也就無從下手去修改它瞭。
所以,學會正則表達式還是有必要的,至少以後你的同事寫出來後,不會在腦子裡出現 “這是寫的啥玩意兒啊?怎麼我看不懂” 的想法。
正則表達式
什麼是正則表達式?通過上面的案例大傢可能多少有點瞭解瞭。是的,他就是通過一行字符串,來描述一定的規則(如下圖箭頭所指紅框處)。
命名規范
正則表達式的英文為 Regular Expression,所以我們通常采用這兩個單詞的首幾個字母合在一起,把正則表達式相關的變量名定義為 regexp(單數) 或 regexps(復數) 。
比如:
又比如,在 Java 的 String 類中,有幾個相關替換的方法,它也是支持正則表達式的,他的參數命名也是 regex 。
結構組成
正則表達式通常由一些普通字符,以及一些元字符組成。
普通字符:就是本身作為一個字符時,它不具有其他含義,像我們常用的大小寫字母和數字。
元字符:就是除瞭本身作為一個字符外,他還可以表達其他含義(下圖是部分元字符節選)。
其實,我們學習正則表達式,大部分就是基於元字符的學習。
用途場景
學習瞭正則表達式,我們可以有哪些用途場景呢?
(1)做字符串的規則驗證(比如前面的案例引入中,我們可以通過正則表達式來驗證一個密碼是否符合規則)。
(2)做字符串的替換(比如將一個字符串中所有的大小寫字母去掉,或者替換為指定符號)。
(3)提取字符串中所需要的字符(比如一個字符串中所有的數字提取出來,組成一個新的字符串)。
Java中的正則校驗
正則表達式主要用途就是校驗字符串,那麼在Java中,隻需要通過下面這個方法即可進行校驗。
其中:
regex 是我們需要寫的正則表達式校驗規則;
input 是我們待校驗的字符串;
返回的 result 就是我們校驗的結果,當為 true 的時候,表示校驗通過,當為 false 的時候,則表示校驗不通過。
正則元字符
正則:普通字符
當我們的正則表達式為一串普通字符(不包含元字符)時,校驗字符串隻有和正則一致時,才會校驗通過。
具體效果如下:
說明:後面例子為節省篇幅,不顯得累贅,就不再貼代碼,隻貼校驗結果。
正則:\d
\d 表示一個數字。
如:
aaa\d:表示驗證的字符串後面必須以 aaa 開頭,且以一個數字結尾。
aaa\dbbb:aaa和bbb中間有一個數字
aaa\d\d:aaa後面跟2個數字
註意:在Java定義的正則裡,由於一個\表示的是字符串轉義,因此在Java定義帶有\的元字符時,還需要多寫一個\,即\\,至於其他語言,自己可查閱相關資料進行瞭解。
正則:\D
\D 表示一個非數字,它和上面 \d 的意思恰好相反。
如:
\D\D\D:則表示一個長度為3,不包含數字的字符串。
111\D222:則表示111和222中間,必須包含一個非數字。
正則:\w
\w 表示一個字母(大小寫均可)、數字,或下劃線。
如:
12\w45:則表示12和45中間必須是一個字母,數字,或下劃線。
正則:\W
\W 與 \w 相反,表示這個位置的字符既不是字母、數字,也不是下劃線。
也就是:特殊符號(除下劃線),或者空格等滿足。
如:
12\w45:則表示12和45中間是一個非字母,非數字,或非下劃線。
正則:\s
\s 表示匹配一個看不見的符號,即空格或制表符(Tab鍵)
如:
88\s99:則表示88和99中間須是一個空格或制表符。
(由於我的編輯器設置瞭1個制表符替換為4個空格,所以這裡就不列舉制表符情況瞭)
正則:\S
\S 與 \s 相反,表示一個可以看得見的符號。
如:
88\S99:則表示88和99中間須有一個看得見的符號。
正則:.
. (小數點) 則表示“\n”和”\r”之外的任何單個字符。
如:
…. :則表示任意四個字符
正則:|
| (豎線) 則表示或的關系,表示檢測的字符串須滿足其中一個時,才符合條件。
如:
aa|bb|cc:則表示輸入的字符串須是aa,或bb,或cc其中的一個。
註意,如果我們或者關系的前後還有其它字符時,需要用()將他們包裹起來。
如:
xx(aa|bb|cc)yy:則表示輸入的字符串須是xx開頭,yy結尾,且中間是aa,或bb,或cc其中的一個。
正則:[abc]
[ ] 表示匹配其中任意一個字符。
如:
a[bcd]e:則表示a和e的中間須是b,或c,或d其中的一個
註意:用 | 表示其中之一,他可以是字符,也可以是字符串。而隻用中括號時,則隻表示其中一個字符。
正則:[^abc]
[^ ] 表示不與中括號裡的任意字符匹配。
如:
a[^bcd]e:則表示a和e的中間除b,c,d這三個字符外,其他的字符都滿足。
正則:[a-z]
[值1-值2] 則表示值1到值2中間的所有字符都滿足(包括值1和值2)。常用該正則來表示大小寫字母范圍,數字范圍。
如:
a[b-d]e:等同於 a[bcd]e,因為 b-d 其實就是b,c,d三個數。
a[0-9]e:則表示a和e中間是一個數字,等同於 a\de(前面說過\d表示一個數字)
正則:[^a-z]
[^值1-值2] 則表示除值1和值2之外的所有字符,都可以滿足。
如:
a[^1-3]e:則表示a和e中間的字符,隻要不是1,2,3,則都滿足。
正則:\num
這裡的num指number,也就是數字,當\後面跟數字,表示匹配第幾個括號中的結果。
比如:現在有 abcd 字符串,當我們用小括號把 c 包裹起來後,然後在字符串後面寫上 \1,即 ab(c)d\1,則這裡的 \1 就指 c,因為 \1 表示第1個小括號中的結果。
ab(c)d\1:等同於 abcdc 。
如果我們繼續把 ab(c)d\1 中的 d 包括起來,並在後面寫上 \2,即 ab(c)(d)\1\2, 那麼這裡的 \2 就表示 d 這個字符,因為第2個小括號的結果是 d,所以整個表達式就等同於 abcdcd 。
ab(c)(d)\1\2:等同於 abcdcd,也等同於 ab(cd)\1 。
正則:?
? 表示匹配前面的子表達式零次或一次。
如:
abc?de: 表示可匹配的字符串為 abde (匹配0次c) 或 abcde (匹配1次c)。
正則:+
匹配前面的子表達式一次或多次 (次數 >= 1,即至少1次)
如:
abc+de:ab 和 de 之前至少有一個 c 。
正則:{n}
這裡的 n是一個非負整數。匹配確定的前面的子表達式n次。
如:
abcde:表示 ab 和 de 之間有3個c。
ab(xx|yy)de:表示 ab 和 de 之間有 xx 或 yy 的個數, 一起合計為3個。
正則:
m和n均為非負整數,其中 n
如:
abcde:表示 ab 和 de 之間有 2 到 3 個 c。
正則:*
表示匹配前面的子表達式任意次。
如:
abc*de:表示 ab 和 de 之間有任意個數(包括0)c 。
如果文章對你有所幫助,請給團長一個免費的贊吧,感謝大傢。