從Java1.4起,Java核心API就引入了java.util.regex程序包,它是一種有價值的基礎工具,可以用於很多類型的文本處理, 如匹配,搜索,提取和分析結構化內容.
java.util.regex是一個用正則表達式所訂制的模式來對字符串進行匹配工作的類庫包。它包括兩個類:Pattern和Matcher.
Pattern是一個正則表達式經編譯後的表現模式。 在java中,通過適當命名的Pattern類可以容易確定String是否匹配某種模式.模式可以象匹配某個特定的String那樣簡單,也可以很復 雜,需要采用分組和字符類,如空白,數字,字母或控制符.因為Java字符串基於統一字符編碼(Unicode),正則表達式也適用於國際化的應用程序.
Pattern類的方法簡述
方法
說明
static Pettern compile(String regex,int flag)
編譯模式
,參數regex表示輸入的正則表達式,flag表示模式類型(Pattern.CASE_INSENSITIVE 表示不區分大小寫)
Matcher match(CharSequence input)
獲取匹配器
,input時輸入的待處理的字符串
static boolean matches(String regex, CharSequence input)
快速的匹配調用
,直接根據輸入的模式regex匹配input
String[] split(CharSequence input,int limit)
分隔字符串
input,limit參數可以限制分隔的次數Matcher 一個Matcher對象是一個狀態機器,它依據Pattern對象做為匹配模式對字符串展開匹配檢查。首先一個Pattern實例訂制了一個所用語法與 PERL的類似的正則表達式經編譯後的模式,然後一個Matcher實例在這個給定的Pattern實例的模式控制下進行字符串的匹配工作。
Matcher類的方法簡述
方法
說明
boolean matches()
對整個輸入字符串進行模式匹配.
boolean lookingAt()
從輸入字符串的開始處進行模式匹配
boolean find(int start)
從start處開始匹配模式
int groupCount()
返回匹配後的分組數目
String replaceAll(String replacement)
用給定的replacement全部替代匹配的部分
String repalceFirst(String replacement)
用給定的replacement替代第一次匹配的部分
Matcher appendReplacement(StringBuffer sb,String replacement)
根據模式用replacement替換相應內容,並將匹配的結果添加到sb當前位置之後
StringBuffer appendTail(StringBuffer sb)
將輸入序列中匹配之後的末尾字串添加到sb當前位置之後.正則表達式中常見通配符:
對於單字符串比較而言,使用正則表達式沒有什麼優勢.Regex的真正強大之處在於體現在包括字符類和量詞(*,+,?)的更復雜的模式上.
字符類包括:
復制代碼 代碼如下:
\d 數字
\D 非數字
\w 單字字符(0-9,A-Z,a-z)
\W 非單字字符
\s 空白(空格符,換行符,回車符,制表符)
\S 非空白
[] 由方括號內的一個字符列表創建的自定義字符類
. 匹配任何單個字符
下面的字符將用於控制將一個子模式應用到匹配次數的過程.
? 重復前面的子模式0次到一次
* 重復前面的子模式0次或多次
+ 重復前面的子模式一次到多次
以下是實例部分:
實例一:
正則式是最簡單的能准確匹配一個給定String的模式,模式與要匹配的文本是等價的.靜態的Pattern.matches方法用於比較一個String是否匹配一個給定模式.例程如下:
復制代碼 代碼如下:
String data="java";
boolean result=Pattern.matches("java",data);
實例二:
復制代碼 代碼如下:
String[] dataArr = { "moon", "mon", "moon", "mono" };
for (String str : dataArr) {
String patternStr="m(o+)n";
boolean result = Pattern.matches(patternStr, str);
if (result) {
System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
}
else{
System.out.println("字符串"+str+"匹配模式"+patternStr+"失敗");
}
}
模式是”m(o+)n”,它表示mn中間的o可以重復一次或多次,因此moon,mon,mooon能匹配成功,而mono在n後多了一個o,和模式匹配不上.
注:
+表示一次或多次;?表示0次或一次;*表示0次或多次.
實例三:
復制代碼 代碼如下:
String[] dataArr = { "ban", "ben", "bin", "bon" ,"bun","byn","baen"};
for (String str : dataArr) {
String patternStr="b[aeiou]n";
boolean result = Pattern.matches(patternStr, str);
if (result) {
System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
}
else{
System.out.println("字符串"+str+"匹配模式"+patternStr+"失敗");
}
}
注:方括號中只允許的單個字符,模式“b[aeiou]n”指定,只有以b開頭,n結尾,中間是a,e,i,o,u中任意一個的才能匹配上,所以數組的前五個可以匹配,後兩個元素無法匹配.
方括號[]表示只有其中指定的字符才能匹配.
實例四:
復制代碼 代碼如下:
String[] dataArr = { "been", "bean", "boon", "buin" ,"bynn"};
for (String str : dataArr) {
String patternStr="b(ee|ea|oo)n";
boolean result = Pattern.matches(patternStr, str);
if (result) {
System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
}
else{
System.out.println("字符串"+str+"匹配模式"+patternStr+"失敗");
}
}
如果需要匹配多個字符,那麼[]就不能用上了,這裡我們可以用()加上|來代替,()表示一組,|表示或的關系,模式b(ee|ea|oo)n就能匹配been,bean,boon等.
因此前三個能匹配上,而後兩個不能.
實例五:
復制代碼 代碼如下:
String[] dataArr = { "1", "10", "101", "1010" ,"100+"};
for (String str : dataArr) {
String patternStr="\d+";
boolean result = Pattern.matches(patternStr, str);
if (result) {
System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
}
else{
System.out.println("字符串"+str+"匹配模式"+patternStr+"失敗");
}
}
注:從前面可以知道,\d表示的是數字,而+表示一次或多次,所以模式\d+就表示一位或多位數字.
因此前四個能匹配上,最後一個因為+號是非數字字符而匹配不上.
[/code]
實例六:
復制代碼 代碼如下:
String[] dataArr = { "a100", "b20", "c30", "df10000" ,"gh0t"};
for (String str : dataArr) {
String patternStr="\w+\d+";
boolean result = Pattern.matches(patternStr, str);
if (result) {
System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
}
else{
System.out.println("字符串"+str+"匹配模式"+patternStr+"失敗");
}
}
模式\w+\d+表示的是以多個單字字符開頭,多個數字結尾的字符串,因此前四個能匹配上,最後一個因為數字後還含有單字字符而不能匹配.
實例七:
復制代碼 代碼如下:
String str="薪水,職位 姓名;年齡 性別";
String[] dataArr =str.split("[,\s;]");
for (String strTmp : dataArr) {
System.out.println(strTmp);
}
String類的split函數支持正則表達式,上例中模式能匹配”,”,單個空格,”;”中的一個,split函數能把它們中任意一個當作分隔符,將一個字符串劈分成字符串數組.
實例八:
復制代碼 代碼如下:
String str="2007年12月11日";
Pattern p = Pattern.compile("[年月日]");
String[] dataArr =p.split(str);
for (String strTmp : dataArr) {
System.out.println(strTmp);
}
Pattern是一個正則表達式經編譯後的表現模式 ,它的split方法能有效劈分字符串.
注意其和String.split()使用上的不同.
實例九:
復制代碼 代碼如下:
String str="10元 1000人民幣 10000元 100000RMB";
str=str.replaceAll("(\d+)(元|人民幣|RMB)", "¥");
System.out.println(str);
上例中,模式“(\d+)(元|人民幣|RMB)”按括號分成了兩組,第一組\d+匹配單個或多個數字,第二組匹配元,人民幣,RMB中的任意一個,替換部分表示第一個組匹配的部分不變,其余組替換成¥.
替換後的str為¥10 ¥1000 ¥10000 ¥100000
實例十:
復制代碼 代碼如下:
Pattern p = Pattern.compile("m(o+)n",Pattern.CASE_INSENSITIVE);
// 用Pattern類的matcher()方法生成一個Matcher對象
Matcher m = p.matcher("moon mooon Mon mooooon Mooon");
StringBuffer sb = new StringBuffer();
// 使用find()方法查找第一個匹配的對象
boolean result = m.find();
// 使用循環找出模式匹配的內容替換之,再將內容加到sb裡
while (result) {
m.appendReplacement(sb, "moon");
result = m.find();
}
// 最後調用appendTail()方法將最後一次匹配後的剩余字符串加到sb裡;
m.appendTail(sb);
System.out.println("替換後內容是" + sb.toString());
實例十一:
除了用+表示一次或多次,*表示0次或多次,?表示0次或一次外,還可以用{}來指定精確指定出現的次數,X{2,5}表示X最少出現2次,最多出現5次;X{2,}表示X最少出現2次,多則不限;X{5}表示X只精確的出現5次.
例程:
復制代碼 代碼如下:
String[] dataArr = { "google", "gooogle", "gooooogle", "goooooogle","ggle"};
for (String str : dataArr) {
String patternStr = "g(o{2,5})gle";
boolean result = Pattern.matches(patternStr, str);
if (result) {
System.out.println("字符串" + str + "匹配模式" + patternStr + "成功");
} else {
System.out.println("字符串" + str + "匹配模式" + patternStr + "失敗");
}
}
實例十二:
-表示從..到…,如[a-e]等同於[abcde]
復制代碼 代碼如下:
String[] dataArr = { "Tan", "Tbn", "Tcn", "Ton","Twn"};
for (String str : dataArr) {
String regex = "T[a-c]n";
boolean result = Pattern.matches(regex, str);
if (result) {
System.out.println("字符串" + str + "匹配模式" + regex + "成功");
} else {
System.out.println("字符串" + str + "匹配模式" + regex + "失敗");
}
}
實例十三:不區分大小寫匹配.
正則表達式默認都是區分大小寫的,使用了Pattern.CASE_INSENSITIVE則不對大小寫進行區分.
復制代碼 代碼如下:
String patternStr="ab";
Pattern pattern=Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);
String[] dataArr = { "ab", "Ab", "AB"};
for (String str : dataArr) {
Matcher matcher=pattern.matcher(str);
if(matcher.find()){
System.out.println("字符串" + str + "匹配模式" + patternStr + "成功");
}
}
實例十四:使用正則表達式劈分字符串.
復制代碼 代碼如下:
注意這裡要把復雜的模式寫在前面,否則簡單模式會先匹配上.
String input="職務=GM 薪水=50000 , 姓名=職業經理人 ; 性別=男 年齡=45 ";
String patternStr="(\s*,\s*)|(\s*;\s*)|(\s+)";
Pattern pattern=Pattern.compile(patternStr);
String[] dataArr=pattern.split(input);
for (String str : dataArr) {
System.out.println(str);
}
實例十五:解析正則表達式中的文字,對應第一個小括號括起來的group1.
復制代碼 代碼如下:
String regex="<(\w+)>(\w+)</>";
Pattern pattern=Pattern.compile(regex);
String input="<name>Bill</name><salary>50000</salary><title>GM</title>";
Matcher matcher=pattern.matcher(input);
while(matcher.find()){
System.out.println(matcher.group(2));
}
實例十六:將單詞數字混合的字符串的單詞部分大寫.
復制代碼 代碼如下:
String regex="([a-zA-Z]+[0-9]+)";
Pattern pattern=Pattern.compile(regex);
String input="age45 salary500000 50000 title";
Matcher matcher=pattern.matcher(input);
StringBuffer sb=new StringBuffer();
while(matcher.find()){
String replacement=matcher.group(1).toUpperCase();
matcher.appendReplacement(sb, replacement);
}
matcher.appendTail(sb);
System.out.println("替換完的字串為"+sb.toString());