之前在程序中登錄或者校驗也會常常用正則,可是通常都是去網上找現成的,最近研究了一下,仍是發現很博大精深的,並且,熟練了語法,的確很是方便,因此在這裏總結推薦給你們。javascript
在工做中常常會遇到這樣的狀況,,好比咱們須要驗證輸入是否是一個座機電話,如010-1234567.若是不用正則表達式,怎麼判斷呢?
看一下下面這個代碼:java
private boolean isTel(String input){
if (input.length()!=11){
return false;
}
for (int i = 0; i<input.length();i++){
if (i==3){
if (input.charAt(i)!='-'){
return false;
}
}else {
if (!Character.isDigit(input.charAt(i))){
return false;
}
}
}
return true;
}複製代碼
感受有些麻煩,若是還要斷定必須是010開頭的或者01x開頭的,豈不是更麻煩,這樣,使用正則表達式,就能夠解決這個問題。不只僅是判斷電話,包括驗證郵箱,驗證網址,找到一個長字符串中的固定字母位置等等,使用正則表達式都是很方便的。android
在介紹用法以前,須要知道正則表達式中的一些特殊符號表明什麼,這個能夠查詢文章結尾的附錄。git
既然說到了是驗證電話,那就先看看,座機號碼如何驗證:正則表達式
Pattern pattern;
Matcher matcher;
pattern = Pattern.compile("\\d\\d\\d[-]\\d\\d\\d\\d\\d\\d\\d");
matcher = pattern.matcher(result);
if (matcher.matches()){
show(matcher.group());
}else {
show("不是座機號碼");
}複製代碼
其中result是輸入的字符串。
\d
表明的是數字,\d
前面還有一個\\
是爲了轉義。
[]中的字符表示的是固定字符,在電話中固定字符就是-。
matcher.group()是將匹配結果輸出網絡
pattern = Pattern.compile("[1][3|7|8]\\d{9}");
matcher = pattern.matcher(result);
if (matcher.find()){
show(matcher.group());
}else {
show("不是手機號碼");
}複製代碼
第一個[1]表示第一位是1,[3|7|8]表示第二位可使3,7,8,\d{9}表示後面九位都是數字類型,因此用\dapp
String regEx = "[a-zA-Z_]{1,}[a-zA-Z_0-9]{0,}@(([a-zA-Z0-9]){1,}\.){1,3}[a-zA-Z\-]{1,}";
pattern = Pattern.compile(regEx);
matcher = pattern.matcher(result);
if (matcher.find()){
show(matcher.group());
}else {
show("不是郵箱");
}複製代碼
[a-zA-Z]表示英文字母和下劃線,任意均可以。其中a-z這種寫法,表示a-z任何字母,若是x-z就只能匹配xyz。
{1,}表示[a-zA-Z]中所匹配的字母至少出現1次。連起來就表示,字符串要以字母或下劃線開始,開始的時候必須有1位字母哪怕f@163.com都是能夠的。
字母以後是數字字母下劃線均可以了{0,}表示至少有0位,而後就是@符號。
(([a-zA-Z0-9]){1,}.)表示以任何字符開始,至少有1個,而後以.結尾的字符串,即xxx.類型的字符串,{1,3}至少有一個,最多有3個,爲的是有些郵箱是@vip.163.xxx,這樣的就會有兩個xxx.
最後以[a-zA-Z-]{1,}結尾,表示最後的.後面還要接一個字符串,多是com多是net函數
好吧,我不知道該如何形容這個概念,我在學習這塊的時候,一直不明白的一個問題,就是正則表達式,能夠校驗一個字符串,可是有兩種狀況:
1.好比我但願字符串中有手機號,而後我用正則能夠取到字符串那麼這個字符串是「手機號:136xxxxxxxx」都是能夠的,也就是,前面有部分中文,是不影響的,我只取出我要的。
2.好比我但願嚴格匹配,也就是「手機號:136xxxxxxxx」是不行的,必需要「136xxxxxxxx」不能帶有其餘字符。
這種狀況個人想法是依靠^和$。學習
"[1][3|7|8]\\d{9}"
那麼咱們匹配"tel is 136xxxxxxxx"也是能夠匹配到的,如今咱們改一下匹配規則:"^[1][3|7|8]\\d{9}$"
,這時就不能再匹配"tel is 136xxxxxxxx"了,只能匹配"136xxxxxxxx"pattern = Pattern.compile("[,|]+");
String[] strs = pattern.split("hello,Hello android,hello deep,,android|Google");
for (int i=0;i<strs.length;i++) {
Log.e("deep","strs="+strs[i]);
}複製代碼
輸出結果是:ui
05-11 11:49:30.473 30824 30824 E deep : strs=hello
05-11 11:49:30.473 30824 30824 E deep : strs=Hello android
05-11 11:49:30.473 30824 30824 E deep : strs=hello deep
05-11 11:49:30.475 30824 30824 E deep : strs=android
05-11 11:49:30.475 30824 30824 E deep : strs=Google複製代碼
"[,|]+"
中+是之前面的字符至少一個進行匹配,[,|]是以,或|進行匹配,因此匹配到字符串中就是,或,,或|。
因爲用的是split方法,因此就是以匹配的字符進行分割,分割結果如log所示
pattern = Pattern.compile("android");
matcher = pattern.matcher("android Hello World,android Hello World");
Log.e("deep",matcher.replaceFirst("deep"));複製代碼
結果以下:
05-11 13:36:03.285 23098 23098 E deep : deep Hello World,android Hello World複製代碼
matcher.replaceFirst只替換了匹配到的第一個
pattern = Pattern.compile("android");
matcher = pattern.matcher("android Hello World,android Hello World");
Log.e("deep",matcher.replaceAll("deep"));複製代碼
結果以下:
05-11 13:38:09.739 24160 24160 E deep : deep Hello World,deep Hello World複製代碼
matcher.replaceAll替換了匹配到的全部android
pattern = Pattern.compile("android");
matcher = pattern.matcher("android Hello World,android Hello World ");
StringBuffer sbr = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sbr, "deep");
}
matcher.appendTail(sbr);
Log.e("deep",sbr.toString());複製代碼
結果以下:
05-11 13:38:09.739 24160 24160 E deep : deep Hello World,deep Hello World複製代碼
appendReplacement是逐段匹配替換添加到緩衝區
附錄中內容摘自網絡不一樣文章,我只是把他們粘貼在了一塊兒。
語法 | 用處 |
---|---|
\ | 轉移符:將下一個字符標記符、或一個向後引用、或一個八進制轉義符。例如,「\n」匹配\n。「\n」匹配換行符。序列「\」匹配「\」而「(」則匹配「(」。 |
^ | 匹配輸入字符串的開始位置。若是設置了RegExp對象的Multiline屬性,^也匹配「\n」或「\r」以後的位置。 |
$ | 匹配輸入字符串的結束位置。若是設置了RegExp對象的Multiline屬性,^也匹配「\n」或「\r」以後的位置。 |
* | 匹配前面的子表達式任意次。例如,zo能匹配「z」,「zo」以及「zoo」。等價於{0,}。 |
+ | 匹配前面的子表達式一次或屢次(大於等於1次)。例如,「zo+」能匹配「zo」以及「zoo」,但不能匹配「z」。+等價於{1,}。 |
? | 匹配前面的子表達式零次或一次。例如,「do(es)?」能夠匹配「do」或「does」中的「do」。?等價於{0,1}。 |
{n} | n是一個非負整數。匹配肯定的n次。例如,「o{2}」不能匹配「Bob」中的「o」,可是能匹配「food」中的兩個o。 |
{n,} | n是一個非負整數。至少匹配n次。例如,「o{2,}」不能匹配「Bob」中的「o」,但能匹配「foooood」中的全部o。「o{1,}」等價於「o+」。「o{0,}」則等價於「o*」。 |
{n,m} | m和n均爲非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,「o{1,3}」將匹配「fooooood」中的前三個o。「o{0,1}」等價於「o?」。請注意在逗號和兩個數之間不能有空格。 |
? | 當該字符緊跟在任何一個其餘限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘量少的匹配所搜索的字符串,而默認的貪婪模式則儘量多的匹配所搜索的字符串。例如,對於字符串「oooo」,「o+?」將匹配單個「o」,而「o+」將匹配全部「o」。 |
.點 | 匹配除「\r\n」以外的任何單個字符。要匹配包括「\r\n」在內的任何字符,請使用像「[\s\S]」的模式。 |
^[\u0391-\uFFE5]+$ | 一個或多個漢字 |
x(豎線)y | 匹配x或y。例如,「z(豎線)food」能匹配「z」或「food」或"zood"(此處請謹慎)。「(z(豎線)f)ood」則匹配「zood」或「food」。 |
[xyz] | 字符集合。匹配所包含的任意一個字符。例如,「[abc]」能夠匹配「plain」中的「a」。 |
[\^xyz] | 負值字符集合。匹配未包含的任意字符。例如,「[^abc]」能夠匹配「plain」中的「plin」。 |
[a-z] | 字符範圍。匹配指定範圍內的任意字符。例如,「[a-z]」能夠匹配「a」到「z」範圍內的任意小寫字母字符。注意:只有連字符在字符組內部時,而且出如今兩個字符之間時,才能表示字符的範圍; 若是出字符組的開頭,則只能表示連字符自己. |
[\^a-z] | 負值字符範圍。匹配任何不在指定範圍內的任意字符。例如,「[\^a-z]」能夠匹配任何不在「a」到「z」範圍內的任意字符。 |
\b | 匹配一個單詞邊界,也就是指單詞和空格間的位置(即正則表達式的「匹配」有兩種概念,一種是匹配字符,一種是匹配位置,這裏的\b就是匹配位置的)。例如,「er\b」能夠匹配「never」中的「er」,但不能匹配「verb」中的「er」。 |
\B | 匹配非單詞邊界。「er\B」能匹配「verb」中的「er」,但不能匹配「never」中的「er」。 |
\cx | 匹配由x指明的控制字符。例如,\cM匹配一個Control-M或回車符。x的值必須爲A-Z或a-z之一。不然,將c視爲一個原義的「c」字符。 |
\d | 匹配一個數字字符。等價於[0-9]。 |
\D | 匹配一個非數字字符。等價於[^0-9]。 |
\f | 匹配一個換頁符。等價於\x0c和\cL。 |
\n | 匹配一個換行符。等價於\x0a和\cJ。 |
\r | 匹配一個回車符。等價於\x0d和\cM。 |
\s | 匹配任何不可見字符,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。 |
\S | 匹配任何可見字符。等價於[^ \f\n\r\t\v]。 |
\t | 匹配一個製表符。等價於\x09和\cI。 |
\v | 匹配一個垂直製表符。等價於\x0b和\cK。 |
\w | 匹配包括下劃線的任何單詞字符。相似但不等價於「[A-Za-z0-9_]」,這裏的"單詞"字符使用Unicode字符集。 |
\W | 匹配任何非單詞字符。等價於「[^A-Za-z0-9_]」。 |
\xn | 匹配n,其中n爲十六進制轉義值。十六進制轉義值必須爲肯定的兩個數字長。例如,「\x41」匹配「A」。「\x041」則等價於「\x04&1」。正則表達式中可使用ASCII編碼。 |
\num | 匹配num,其中num是一個正整數。對所獲取的匹配的引用。例如,「(.)\1」匹配兩個連續的相同字符。 |
\n | 標識一個八進制轉義值或一個向後引用。若是\n以前至少n個獲取的子表達式,則n爲向後引用。不然,若是n爲八進制數字(0-7),則n爲一個八進制轉義值。 |
\nm | 標識一個八進制轉義值或一個向後引用。若是\nm以前至少有nm個得到子表達式,則nm爲向後引用。若是\nm以前至少有n個獲取,則n爲一個後跟文字m的向後引用。若是前面的條件都不知足,若n和m均爲八進制數字(0-7),則\nm將匹配八進制轉義值nm。 |
\nml | 若是n爲八進制數字(0-7),且m和l均爲八進制數字(0-7),則匹配八進制轉義值nml。 |
\un | 匹配n,其中n是一個用四個十六進制數字表示的Unicode字符。例如,\u00A9匹配版權符號(\©)。 |
\< \> | 匹配詞(word)的開始(\<)和結束(\>)。例如正則表達式\
|
+ | 匹配1或多個正好在它以前的那個字符。例如正則表達式9+匹配九、9九、999等。注意:這個元字符不是全部的軟件都支持的。 |
? | 匹配0或1個正好在它以前的那個字符。注意:這個元字符不是全部的軟件都支持的。 |
{i} {i,j} | 匹配指定數目的字符,這些字符是在它以前的表達式定義的。例如正則表達式A[0-9]{3} 可以匹配字符"A"後面跟着正好3個數字字符的串,例如A12三、A348等,可是不匹配A1234。而正則表達式[0-9]{4,6} 匹配連續的任意4個、5個或者6個數字 |
這裏再也不詳細描述了,由於我尚未遇到過須要設置這些flag的狀況,可是仍是在這裏總結給你們。
在使用Pattern.compile函數時,能夠加入控制正則表達式的匹配行爲的參數:Pattern Pattern.compile(String regex, int flag)
有疑問的朋友歡迎給我留言指正,或者關注個人公衆號留言: