正則表達(dá)式在我眼中是一種非常強(qiáng)大的工具,可以判斷輸入的文本是不是與要求匹配,從輸入的文件中提取關(guān)鍵信息等等,而在實(shí)驗(yàn)以及學(xué)習(xí)過(guò)程中,我接觸到的使用的最多的功能就是判斷字符串與要求的格式是否匹配,下面是一個(gè)超級(jí)簡(jiǎn)單的例子
Pattern?p = Pattern.compile("\\w+");
Matcher m = p.matcher(INPUT);
這個(gè)語(yǔ)句判斷的是INPUT的格式是否為一個(gè)或多個(gè)字符的形式(\\w+),如果是,那么 m.find()就為true,否則為false。
從這個(gè)例子類(lèi)推,根據(jù)不同的正則格式的表達(dá)就可以匹配多種形式的字符串,下面是我選出來(lái)的比較常用的一些匹配格式:
正則字符? ? ? ? ? ? 匹配字符串
\? ? ? ? ? ? ? ? ? ? ? ? ? 將下一字符標(biāo)記為特殊字符、文本、反向引用或八進(jìn)制轉(zhuǎn)義符
.? ? ? ? ? ? ? ? ? ? ? ? ? 任意字符
*? ? ? ? ? ? ? ? ? ? ? ? ? 零次或多次匹配前面的字符或子表達(dá)式,例如,op* 匹配"opo"和"oppo"
+? ? ? ? ? ? ? ? ? ? ? ? ?至少一次或多次匹配前面的字符或子表達(dá)式,例如,"op+"匹配"opp",不匹配"o"
^? ? ? ? ? ? ? ? ? ? ? ? ? 匹配輸入字符串開(kāi)始的位置
$? ? ? ? ? ? ? ? ? ? ? ? ?匹配輸入字符串結(jié)尾的位置
?? ? ? ? ? ? ? ? ? ? ? ? 零次或一次匹配前面的字符或子表達(dá)式
[xyz]? ? ? ? ? ? ? ? ? ?字符集。匹配字符集中任一字符
x|y? ? ? ? ? ? ? ? ? ? ? ?匹配?x?或?y
{n}? ? ? ? ? ? ? ? ? ? ??n?是非負(fù)整數(shù),正好匹配?n?次,例如:o{2}匹配"oppo"
[a-z]? ? ? ? ? ? ? ? ? ?字符范圍
[^a-z]? ? ? ? ? ? ? ? 反向范圍字符,匹配不在指定的范圍內(nèi)的任何字符
\d? ? ? ? ? ? ? ? ? ? ?數(shù)字字符匹配
\D? ? ? ? ? ? ? ? ? ? 非數(shù)字字符匹配
\n? ? ? ? ? ? ? ? ? ? ?換行符匹配
\s? ? ? ? ? ? ? ? ? ? ?匹配任何空白字符
\S? ? ? ? ? ? ? ? ? ? ?匹配任何非空白字符
\t? ? ? ? ? ? ? ? ? ? ? 制表符匹配
\w? ? ? ? ? ? ? ? ? ? 匹配任何字類(lèi)字符
\W? ? ? ? ? ? ? ? ? ?與任何非單詞字符匹配
需要注意的是正則表達(dá)式同一字符的大小寫(xiě)不同匹配的字符串也會(huì)不同,而且一般如果小寫(xiě)匹配的是哪種字符,大寫(xiě)匹配的是哪種字符的反義,還有,一些字符本身在正則表達(dá)式里面就有特殊含義,比如.(匹配任意字符),那么在匹配"."這個(gè)字符的時(shí)候,就需要用到轉(zhuǎn)義字符\\,也就是"\\."這種形式。
還有一個(gè)很好用的概念是捕獲組,捕獲組是把多個(gè)字符當(dāng)一個(gè)單獨(dú)單元進(jìn)行處理的方法,它通過(guò)對(duì)括號(hào)內(nèi)的字符分組來(lái)創(chuàng)建。
例如,正則表達(dá)式 (hey) 創(chuàng)建了一個(gè)單一分組,組里包含"h","e",和"y"。
捕獲組通過(guò)從左至右計(jì)算其開(kāi)括號(hào)來(lái)編號(hào)。例如,在表達(dá)式((A)(B(C))),有四個(gè)組:
((A)(B(C)))
(A)
(B(C))
(C)
可以通過(guò)調(diào)用 matcher 對(duì)象的 groupCount 方法來(lái)查看表達(dá)式有多少個(gè)分組。groupCount 方法返回一個(gè) int 值,表示matcher對(duì)象當(dāng)前有多個(gè)捕獲組。
還有一個(gè)特殊的組(group(0)),代表整個(gè)表達(dá)式。不包括在 groupCount 的返回值中。
在pattern類(lèi)中,compil()方法還可以接受一個(gè)很好用的標(biāo)記參數(shù),下面是這些標(biāo)記參數(shù)與他們編譯的效果
Pattern.CANON_EQ
當(dāng)且僅當(dāng)兩個(gè)字符的"正規(guī)分解"都完全相同的情況下,才認(rèn)定匹配。比如用了這個(gè)標(biāo)志之后,表達(dá)式"a/u030A"會(huì)匹配"?"。默認(rèn)情況下,不考慮"規(guī)范相等性"。
Pattern.CASE_INSENSITIVE(?i)
默認(rèn)情況下,大小寫(xiě)不明感的匹配只適用于US-ASCII字符集。這個(gè)標(biāo)志能讓表達(dá)式忽略大小寫(xiě)進(jìn)行匹配。這個(gè)是非常常用的標(biāo)記參數(shù)之一。在實(shí)驗(yàn)中也用到了,可以增強(qiáng)用戶(hù)輸入以及文本輸入的容錯(cuò)性。
Pattern.COMMENTS(?x)
在這種模式下,匹配時(shí)會(huì)忽略(正則表達(dá)式里的)空格字符(不是指表達(dá)式里的"http://s",而是指表達(dá)式里的空格,tab,回車(chē)之類(lèi))。這也是非常常用的標(biāo)記參數(shù)之一。
Pattern.DOTALL(?s)
在這種模式下,表達(dá)式'.'可以匹配任意字符,包括表示一行的結(jié)束符。
Pattern.MULTILINE(?m)
在這種模式下,'^'和'$'分別匹配一行的開(kāi)始和結(jié)束。此外,'^'仍然匹配字符串的開(kāi)始,'$'也匹配字符串的結(jié)束。默認(rèn)情況下,這兩個(gè)表達(dá)式僅僅匹配字符串的開(kāi)始和結(jié)束。這也是非常常用的標(biāo)記參數(shù)之一。
Pattern.UNICODE_CASE(?u)
在這個(gè)模式下,如果你還啟用了CASE_INSENSITIVE標(biāo)志,那么它會(huì)對(duì)Unicode字符進(jìn)行大小寫(xiě)不明感的匹配,默認(rèn)情況下,大小寫(xiě)不明感的匹配只適用于US-ASCII字符集。
Pattern.UNIX_LINES(?d)
在這個(gè)模式下,只有'/n'才被認(rèn)作一行的中止,并且與'.','^',以及'$'進(jìn)行匹配。
split()函數(shù)
這是實(shí)驗(yàn)里面用的次數(shù)相當(dāng)多的一個(gè)函數(shù)了,它可以將字符串按照要求劃分成一個(gè)字符串?dāng)?shù)組,比如,將"192.168.52.11"劃分成一個(gè)大小為4,每個(gè)位置裝一段數(shù)字的數(shù)組,只需要
input = "192.168.52.11";
String[] temp = input.split("\\.");
那么temp數(shù)組里面裝的就分別是"192","168","52","11"。非常適用于要在一長(zhǎng)串字符串里面按照格式劃分查找信息。比如時(shí)間,比如在日志里面用"|"分開(kāi)的各個(gè)信息,要找到屬于哪個(gè)類(lèi),哪個(gè)方法,就會(huì)頻繁的用到這個(gè)函數(shù)。