从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=chestern. ("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[] dataArrString[] dataArr> "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 :for (String str :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=" 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 = Pattern (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則不對大小寫進行區分.
代碼如下:
代碼如下:
"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);
複製程式碼
程式碼如下:
String regex="(w )>";
Pattern pattern=Pattern.compile(regex);
String input="
Bill50000GM";
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(); matcher.appendReplacement(sb, replacement); } matcher.appendTail(sb); System.out.println("替換完的字串為" sb.toString());