Java正則表達式(一)

一、概述
 
正則表達式是Java處理字符串、文本的重要工具。 自從jdk1.4推出java.util.regex包,就爲我們提供了很好的JAVA正則表達式應用平臺。
 
Java對正則表達式的處理集中在以下兩個兩個類:
java.util.regex.Matcher   模式類:用來表示一個編譯過的正則表達式。
java.util.regex.Pattern   匹配類:用模式匹配一個字符串所表達的抽象結果。
(很遺憾,Java Doc並沒有給出這兩個類的職責概念。)
 
二、一些容易迷糊的問題
 
1、Java對反斜線處理的問題
 
在其他語言中,\\表示要插入一個字符\;
在Java語言中,\\表示要插入正則表達式的反斜線,並且後面的字符有特殊意義。
 
看API文檔:
預定義字符類
. 任何字符(與行結束符可能匹配也可能不匹配)
\d 數字:[0-9]
\D 非數字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 單詞字符:[a-zA-Z_0-9]
\W 非單詞字符:[^\w]
/b 一個單詞的邊界
/B 一個非單詞的邊界
/G 前一個匹配的結束
 
 
在Java正則表達式中,如果要插入一個\字符,則需要在正則表達式中寫成\\\\,原因是下面的APIDoc定義\\表示一個反斜線。
但是如果在正則表示式中表示回車換行等,則不需要多添加反斜線了。比如回車\r就寫作\r.
 
字符
x 字符 x
\\ 反斜線字符
\0n 帶有八進制值 0 的字符 n (0 <= n <= 7)
\0nn 帶有八進制值 0 的字符 nn (0 <= n <= 7)
\0mnn 帶有八進制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh 帶有十六進制值 0x 的字符 hh
\uhhhh 帶有十六進制值 0x 的字符 hhhh
\t 製表符 ('\u0009')
\n 新行(換行)符 ('\u000A')
\r 回車符 ('\u000D')
\f 換頁符 ('\u000C')
\a 報警 (bell) 符 ('\u0007')
\e 轉義符 ('\u001B')
\cx 對應於 x 的控制符

^爲限制開頭
^java     條件限制爲以Java爲開頭字符
$爲限制結尾
java$     條件限制爲以java爲結尾字符
.  條件限制除/n以外任意一個單獨字符
java..     條件限制爲java後除換行外任意兩個字符


加入特定限制條件「[]」
[a-z]     條件限制在小寫a to z範圍中一個字符
[A-Z]     條件限制在大寫A to Z範圍中一個字符
[a-zA-Z] 條件限制在小寫a to z或大寫Ato Z範圍中一個字符
[0-9]     條件限制在小寫0 to 9範圍中一個字符
[0-9a-z] 條件限制在小寫0 to 9或ato z範圍中一個字符
[0-9[a-z]] 條件限制在小寫0 to 9或ato z範圍中一個字符(交集)

[]中加入^後加再次限制條件「[^]」
[^a-z]     條件限制在非小寫ato z範圍中一個字符
[^A-Z]     條件限制在非大寫Ato Z範圍中一個字符
[^a-zA-Z] 條件限制在非小寫a to z或大寫Ato Z範圍中一個字符
[^0-9]     條件限制在非小寫0to 9範圍中一個字符
[^0-9a-z] 條件限制在非小寫0 to 9或ato z範圍中一個字符
[^0-9[a-z]] 條件限制在非小寫0 to 9或ato z範圍中一個字符(交集)

在限制條件爲特定字符出現0次以上時,可以使用「*」
J*     0個以上J
.*     0個以上任意字符
J.*D     J與D之間0個以上任意字符

在限制條件爲特定字符出現1次以上時,可以使用「+」
J+     1個以上J
.+     1個以上任意字符
J.+D     J與D之間1個以上任意字符

在限制條件爲特定字符出現有0或1次以上時,可以使用「?」
JA?     J或者JA出現

限制爲連續出現指定次數字符「{a}」
J{2}     JJ
J{3}     JJJ
文字a個以上,並且「{a,}」
J{3,}     JJJ,JJJJ,JJJJJ,???(3次以上J並存)
文字個以上,b個以下「{a,b}」
J{3,5}     JJJ或JJJJ或JJJJJ
兩者取一「|」
J|A     J或A
Java|Hello     Java或Hello
 
「()」中規定一個組合類型
比如,我查詢<ahref=/"index.html/">index</a>中<ahref></a>間的數據,可寫作<a.*href=/".*/">(.+?)</a>


 
2、Matcher.find():嘗試查找與模式匹配的字符序列的下一個子序列。此方法從字符序列的開頭開始,如果該方法的前一次調用成功了並且從那時開始匹配器沒有被重置,則從以前匹配操作沒有匹配的第一個字符開始,即如果前一次找到與模式匹配的子序列則這次從這個子序列後開始查找。
 
3、Matcher.matchers():判斷整個字符序列與模式是否匹配。當連續用Matcher對象檢查多個字符串時候,可以使用
Matcher.reset():重置匹配器,放棄其所有顯式狀態信息並將其添加位置設置爲零。
或者Matcher.reset(CharSequence input)  重置此具有新輸入序列的匹配器。
來重複使用匹配器。
 
4、組的概念,這個概念很重要,組是用括號劃分的正則表達式,可以通過編號來引用組。組號從0開始,有幾對小括號就表示有幾個組,並且組可以嵌套,組號爲0的表示整個表達式,組號爲1的表示第一個組,依此類推。
例如:A(B)C(D)E正則式中有三組,組0是ABCDE,組1是B,組2是D;
A((B)C)(D)E正則式中有四組:組0是ABCDE,組1是BC,組2是B;組3是C,組4是D。
 
int groupCount():返回匹配其模式中組的數目,不包括第0組。
String group():返回前一次匹配操作(如find())的第0組。
String group(int group):返回前一次匹配操作期間指定的組所匹配的子序列。如果該匹配成功,但指定組未能匹配字符序列的任何部分,則返回 null。
int start(int group):返回前一次匹配操作期間指定的組所匹配的子序列的初始索引。
int end(int group):返回前一次匹配操作期間指定的組所匹配的子序列的最後索引+1。
 
5、匹配的範圍的控制
最變態的就要算lookingAt()方法了,名字很讓人迷惑,需要認真看APIDoc。
 
start()  返回以前匹配的初始索引。
end()  返回最後匹配字符之後的偏移量。
 
public boolean lookingAt()嘗試將從區域開頭開始的輸入序列與該模式匹配。
與 matches 方法類似,此方法始終從區域的開頭開始;與之不同的是,它不需要匹配整個區域。
如果匹配成功,則可以通過 start、end 和 group 方法獲取更多信息。
返回:
當且僅當輸入序列的前綴匹配此匹配器的模式時才返回 true。
 

 
三、字符串的替換
 
String.replace(char oldChar, char newChar)
          返回一個新的字符串,它是通過用 newChar 替換此字符串中出現的所有 oldChar 而生成的。
String.replace(CharSequence target, CharSequence replacement)
          使用指定的字面值替換序列替換此字符串匹配字面值目標序列的每個子字符串。
String.replaceAll(String regex, String replacement)
          使用給定的 replacement 字符串替換此字符串匹配給定的正則表達式的每個子字符串。
String.replaceFirst(String regex, String replacement)
          使用給定的 replacement 字符串替換此字符串匹配給定的正則表達式的第一個子字符串。
 
StringBuffer.replace(int start, int end, String str)
          使用給定 String 中的字符替換此序列的子字符串中的字符。
StringBuilder.replace(int, int, java.lang.String)
          使用給定 String 中的字符替換此序列的子字符串中的字符。
 
Matcher.replaceAll(String replacement)
          替換模式與給定替換字符串相匹配的輸入序列的每個子序列。
Matcher.replaceFirst(String replacement)
          替換模式與給定替換字符串匹配的輸入序列的第一個子序列。
 
四、字符串的切分
 
 String[] split(String regex)
          根據給定的正則表達式的匹配來拆分此字符串。
 String[] split(String regex, int limit)
          根據匹配給定的正則表達式來拆分此字符串。
  
當然,還有一個StringTokenizer類,可以用來切分字符串,但是現在SUN已經不推薦使用了。
轉變下思路,其實用正則表達式也可以達到將字符串切分爲段的目的
發佈了53 篇原創文章 · 獲贊 20 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章