正則表達式的作用
提供更強大的字符串處理能力,測試字符串內的模式,例如,可以測試輸入字符串,以查看字符串內是否出現電話號碼模式或身份證號碼模式。即數據驗證替換文本可以使用正則表達式來識別文檔中的特定文本,完全刪除該文本或者用其他文本替換它。
基於模式匹配從字符串中提取子字符串可以查找文檔內或輸入域內特定的文本。
在Java中使用正則表達式
正則表達式在字符串處理上有著強大的功能,sun在jdk1.4加入了對它的支持,jdk1.4中加入了java.util.regex包提供對正則表達式的支持。而且Java.lang.String類中的replaceAll和split函數也是調用的正則表達式來實現的。
正則表達式對字符串的操作主要包括:
1.字符串匹配
2.指定字符串替換
3.指定字符串查找
4.字符串分割
Pattern類
Pattern類的實例表示以字符串形式指定的正則表達式,其語 法類似於Perl所用的語法。
用字符串形式指定的正則表達式,必須先編譯成Pattern類的 實例。生成的模式用於創建Matcher對象,它根據正則表達式與任 意字符序列進行匹配。多個匹配器可以共享一個模式,因為它是非專屬的。
用compile方法把給定的正則表達式編譯成模式,然後用 matcher方法創建一個匹配器,這個匹配器將根據此模式對給定輸 入進行匹配。pattern 方法可返回編譯這個模式所用的正則表達式。
Matcher類
通過調用某個模式的matcher方法,從這個模式生成匹配器。 匹配器創建之後,就可以用它來執行三類不同的匹配操作:
matches方法根據此模式,對整個輸入序列進行匹配。
lookingAt方法根據此模式,從開始處對輸入序列進 行匹配。
find方法掃描輸入序列,尋找下一個與模式匹配的地方。
這些方法都會返回一個表示成功或失敗的布爾值。假如匹配成功,通過查詢 匹配器的狀態,可以獲得更多的信息。
構建正則表達式
d 等於 [0-9] 數字
D 等於 [^0-9] 非數字
s 等於 [ x0Bf ] 空白字符
S 等於 [^ x0Bf ] 非空白字符
w 等於 [a-zA-Z_0-9] 數字或是英文字
W 等於 [^a-zA-Z_0-9] 非數字與英文字
$ 表示每行的結尾
. 匹配所有字符,包括空格、Tab字符甚至換行符
或 []方括號只答應匹配單個字符
^ 符號稱為否符號。假如用在方括號內,表示不想要匹配的字符。 表示每行的開頭
( ) 形成一組
查詢
import java.util.regex.*; public class RegexExample { public static void main(String[] args) { String str="aaabc efg ABC"; String regEx="aaafff"; Pattern p=Pattern.compile(regEx);//編譯成模式 Matcher m=p.matcher(str);//創建一個匹配器 boolean rs=m.find(); if(rs) { System.out.println("include!!!"); } else { System.out.println("no include!!!"); } } }
假如str中有regEx,那麼rs為true,否則為flase。假如想在查找時忽略大小寫,
則可以寫成Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
提取 (從本例所給完整路徑中提取文件名)
import java.util.regex.*; public class RegexExample2 { public static void main(String[] args) { String regEx=".+(.+)$"; String str="c:dir1dir2 ame.txt"; Pattern p=Pattern.compile(regEx); Matcher m=p.matcher(str); boolean rs=m.find(); for(int i=1;i<=m.groupCount();i++) { System.out.println(m.group(i)); //括號內匹配內容 } } }
以上的執行結果為name.txt,提取的字符串儲存在m.group(i)中,其中i最大值為m.groupCount();
分割
import java.util.regex.*; public class RegexExample3 { public static void main(String[] args) { String regEx="::"; Pattern p=Pattern.compile(regEx); String[] r=p.split("xd::abc::cde"); for(int i=0;i<r.length;i++) { System.out.println(r[i]); } } }
執行後,r就是{xd,abc,cde},其實分割時還有跟簡單的方法:
String str="xd::abc::cde";
String[] r=str.split("::");
替換(刪除)
import java.util.regex.*; public class RegexExample1 { public static void main(String[] args) { String regEx="a+";//表示一個或多個a Pattern p=Pattern.compile(regEx); Matcher m=p.matcher("aaabbced a ccdeaa"); String s=m.replaceAll("A"); System.out.println(s); } }
結果為"Abbced A ccdeA"
假如寫成空串,既可達到刪除的功能,比如:
String s=m.replaceAll("");
結果為"bbced ccde"