1. 程式人生 > >Java正則表示式匹配使用例項

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());