Java正則表示式匹配使用例項
例項一:
正則式是最簡單的能準確匹配一個給定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+就表示一位或多位數字.
因此前四個能匹配上,最後一個因為+號是非數字字元而匹配不上.
例項六:
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);
}
例項十五:解析正則表示式中的文字,/1對應第一個小括號括起來的group1.
String regex="<(/w+)>(/w+)<//1>";
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());