簡介
對于一些文本操作,正則表達式提供了強有力的輔助,它允許我們通過帶有描述性性質(zhì)的描述語言,得到我們需要的文本數(shù)據(jù)。
java正則表達式功能類簡介
對于java而言,其在java.util.regex包中給我們提供了正則表達式功能,該包結(jié)構(gòu)如下圖所示:
java.util.regex
可以看到,
regex包下包含一個接口MatchResult,兩個類Pattern,Matcher,以及一個異常類PatternSyntaxException。其中:
MatchResult:代表匹配操作的結(jié)果,該接口提供了查詢方法用來檢測匹配器匹配正則表達式的結(jié)果。通過MatchResult,可以查看匹配邊界,匹配組合以及組邊界,但是不能進行修改。
Pattern:正則表達式的編譯表現(xiàn)形式。指定為正則表達式的字符串必須首先被編譯成此類的實例,然后,可將得到的模式用于創(chuàng)建Matcher對象,依照正則表達式,該對象可與任意字符序列匹配。執(zhí)行匹配所涉及的所有狀態(tài)都駐留在匹配器中,所以多個匹配器可以共享同一模式。
Matcher:執(zhí)行由Pattern解釋的字符串序列操作引擎。Matcher實現(xiàn)了MatchResult。
PatternSyntaxException:當正則表達式解析出錯時拋出該異常。
通配符簡介
java正則表達式的全部通配符介紹可以在官網(wǎng)API中查看,下面主要介紹其中一些比較常用的:
| 字符類 | |
|---|---|
| [abc] | 匹配a或者b或者c |
| [^abc] | 除了a,b,c以外的字符都匹配 |
| [a-zA-Z] | a-z,A-Z任意一個字符都匹配 |
| [a-d[m-p]] | a-d或者m-p中任意一個字符都匹配 |
| [a-z&&[def]] | 同時滿足a-z和d,e,f中的一個則匹配(并集) |
| [a-z&&[^bc]] | a-z任意一個字符都匹配,除了b和c |
| ab|cd | 或匹配器,匹配 ab 或 cd |
| 預(yù)定義字符類 | |
|---|---|
| . | 任意字符 (與<u>行結(jié)束符</u>可能匹配,也可能不匹配) |
| \d | 數(shù)字 [0-9] |
| \D | 非數(shù)字 [^0-9] |
| \s | 空白字符 [ \t\n\x0B\f\r] |
| \S | 非空白字符 [^\s] |
| \w | 字符類型 [a-zA-Z_0-9] |
| \W | 非字符類型 [^\w] |
| 邊界匹配器 | |
|---|---|
| ^ | 行開頭 |
| $ | 行結(jié)尾 |
| \b | 單詞邊界 |
| \B | 非單詞邊界 |
| Greedy 數(shù)量詞 | |
|---|---|
| X? | X,一次或一次也沒有 |
| X* | X,零次或多次 |
| X+ | X,一次或多次 |
| X{n} | X,恰好n次 |
| X{n,} | X,至少n次 |
| X{n,m} | X,至少n次,但不超過m次 |
例子
正則表達式對文本的操作總結(jié)起來為:匹配,切割,替換,獲取。
- 匹配
判斷給定字符串是否符合QQ號碼格式。
(QQ號碼格式規(guī)范:
1.全部為數(shù)字
2.起碼6位數(shù)字以上,不超過15位數(shù);
3.第一個數(shù)字不能為0;)
String str = "23453463456";
Pattern pattern = Pattern.compile("[1-9]\\d{5,15}");
Matcher matcher = pattern.matcher(str);
boolean bMatch = matcher.matches();
System.out.println("match="+bMatch);
- 切割
對給定字符串,按空格進行切割。
String str="first second third ";
Pattern pattern = Pattern.compile("\\s+");//或者“ ”+
String[] splits = pattern.split(str);
for(int i = 0 ; i < splits.length ; ++i){
System.out.println("splits["+i+"]="+splits[i]);
}
- 替換
對給定字符串,按疊詞進行替換,將疊詞數(shù)量保留一位。
String str="abb3dadadfa333aaaaaaaa";
Pattern pattern = Pattern.compile("(.)\\1+");
Matcher matcher = pattern.matcher(str);
String replaceStr = matcher.replaceAll("$1");
System.out.println("replaceStr="+replaceStr);
注: 此處使用了組概念,用符號()表示一個組,正則表達式"(.)\1+"表達的意思是:任意字符,\1表示引用第一組的結(jié)果,也就是(.)的字符,所以這句話的意思就是第一個字符是任意字符,后面一個字符跟前一個一致,有一個或一個以上。
“$1"表示引用第一個組的內(nèi)容。
- 獲取
對給定字符串,取出大括號{}內(nèi)的字符串。
String str = "users/{user}/repos/{page}/";
Pattern pattern = Pattern.compile("\\{([a-zA-Z][a-zA-Z0-9_-]*)\\}");
Matcher matcher = pattern.matcher(str);
while(matcher.find()){
String findstr = matcher.group();
System.out.println("findstr="+findstr);
}
最后,網(wǎng)上有很多可以直接對正則進行驗證的在線工具,大家可以去找找看。