本文主要講一下什么是正則表達式,正則表達式的一些常用語法,以及我們項目中用到的一些正則表達式.
定義
首先,正則表達式是一種強大而靈活的文本處理工具,使得我們能夠以編程的方式,構(gòu)造復(fù)雜的文本模式,對輸入的字符串進行搜索,一旦找到了匹配這些模式的分,你就能夠隨心所欲地對它們進行處理.因此,正則表達式提供的是一種完全通用的方式,能夠解決各種字符串處理相關(guān)問題:匹配憔维、選擇、編輯以及驗證.
注:正則表達式并不僅限于某一種語言业扒,但是在每種語言中有細微的差別。
語法
在其他語言中蹭沛,\ 表示:我想要在正則表達式中插入一個普通的(字面上的)反斜杠,請不要給它任何特殊的意義摊灭。
在 Java 中帚呼,\ 表示:我要插入一個正則表達式的反斜線,所以其后的字符具有特殊的意義煤杀。
所以,在其他的語言中酌儒,一個反斜杠\就足以具有轉(zhuǎn)義的作用枯途,而在正則表達式中則需要有兩個反斜杠才能被解析為其他語言中的轉(zhuǎn)義作用。也可以簡單的理解在正則表達式中呆躲,兩個 \ 代表其他語言中的一個 \捶索,這也就是為什么表示一位數(shù)字的正則表達式是 \d灰瞻,而表示一個普通的反斜杠是 \\。
普通字符
包括所有大寫和小寫字母酝润、所有數(shù)字要销、所有標點符號和一些其他符號。
非打印字符
特殊字符
限定符
邊界符
以上圖片來自菜鳥教程.
這些字符構(gòu)成了我們書寫正則表達式的要素.比如寫一個匹配六位數(shù)字的表達式為\d{6},可以根據(jù)自己的需求查閱表格,書寫自己的正則表達式.
String中的正則表達式
應(yīng)用正則表達式最簡單的途徑,就是使用String類的內(nèi)建功能.
matches()
檢查一個String是否匹配所給的正則表達式.split()
split()方法的功能是"將字符串從正則表達式匹配的地方切開", 組裝到一個數(shù)組中去.第一個用的普通字符作為正則表達式,即使用空字符來劃分,第二個和第三個都用到了'//W' ,意思是非單詞字符(可以去上面找一下該字符的說明),它將標點刪掉了通過例子二可以看出來.第三個表示"字母e后面跟著一個或多個非單詞字符".可以看到,在原始字符串中,與正則表達式匹配的部分,在輸出的結(jié)果中都不存在了.
String.split()還有一個重載版本,它允許你限制字符串分割次數(shù).
replaceXXX()
String類自帶的最后一個正則表達式工具是"替換",可以只替換正則表達式第一個匹配的子串,或是替換所有匹配的地方.第一個表達式要匹配的是以字母o開頭,后面跟一個或多個字母(這里是小寫的w),并且只替換掉第一個匹配的部分,"oh"被換成了"gogogo".
第二個是匹配兩個單詞中的任意一個,豎線表示或,并且替換所有匹配部分.
創(chuàng)建正則表達式
一般來說,比起功能有限的String類,我們更愿意構(gòu)造功能強大的正則表達式.因此我們需要用到j(luò)ava.util.regex 包中的三個類:
Pattern 類:
pattern 對象是一個正則表達式的編譯表示浑塞。Pattern 類沒有公共構(gòu)造方法。要創(chuàng)建一個 Pattern 對象掏愁,你必須首先調(diào)用其公共靜態(tài)編譯方法,它返回一個 Pattern 對象果港。該方法接受一個正則表達式作為它的第一個參數(shù)。
Matcher 類:
Matcher 對象是對輸入字符串進行解釋和匹配操作的引擎谢谦。與Pattern 類一樣公浪,Matcher 也沒有公共構(gòu)造方法。你需要調(diào)用 Pattern 對象的 matcher 方法來獲得一個 Matcher 對象厅各。
PatternSyntaxException:
PatternSyntaxException 是一個非強制異常類预柒,它表示一個正則表達式模式中的語法錯誤。
當(dāng)然Pattern和Matcher中還有很多的方法,譬如find(),start(),end(),reset()這里就不展開了,還會再寫一篇來具體介紹這些方法.
項目中用到的一些正則表達式
1.驗證手機號格式是否正確:
/**
* 大陸手機號碼11位數(shù)憔古,匹配格式:前三位固定格式+后8位任意數(shù)
* 此方法中前三位格式有:
* 13+任意數(shù)
* 15+除4的任意數(shù)
* 18+除1和4的任意數(shù)
* 17+除9的任意數(shù)
* 147
*/
public static boolean isChinaPhoneLegal(String str) throws PatternSyntaxException {
String regExp = "^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$";
Pattern p = Pattern.compile(regExp);
Matcher m = p.matcher(str);
return m.matches();
}
/**
* 香港手機號碼8位數(shù)淋袖,5|6|8|9開頭+7位任意數(shù)
*/
public static boolean isHKPhoneLegal(String str)throws PatternSyntaxException {
String regExp = "^(5|6|8|9)\\d{7}$";
Pattern p = Pattern.compile(regExp);
Matcher m = p.matcher(str);
return m.matches();
}
2.驗證郵箱
/**
* 是否是郵箱
* @param string
* @return
*/
public static boolean isEmail(String string) {
Pattern p = Pattern
.compile("^([a-z0-9A-Z]+[-|\\\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\\\.)+[a-zA-Z]{2,}$");
Matcher m = p.matcher(string);
return m.matches();
}
3.在文字中匹配出六位數(shù)的股票代碼
/**
* 匹配股票代碼(查到一個就停止)
* @param stirng
* @return
*/
public static String matchStocks(String stirng) {
String pStr = "(?<=\\D)([0123569]\\d{5})(?=\\D)|^([0123569]\\d{5})(?=\\D)|^([0123569]\\d{5})$|(?<=\\D)([0123569]\\d{5})$";
Pattern pattern = Pattern.compile(pStr);
Matcher matcher = pattern.matcher(stirng);
String str = "";
if (matcher.find()) {
str = matcher.group(0);
}
return str;
}
ps:參考書籍<<Thinking in Java>>.