java.util.regex 包(處理正則表達式) 提供了兩個用來處理正則表達式的工具類:Pattern和Matcher。Pattern用於建立待匹配的正則表達式模型,Matcher用於在匹配完成后對匹配結果進行相應操作。
一.Pattern
◆ 1.1 Pattern.pattern()
返回正則表達式的字符串形式
Pattern p=Pattern.compile("\\w+");
p.pattern();//返回 \w+
◆ 1.2 Pattern.split(CharSequence input)
該方法用於分割字符串,並返回一個String[].
Pattern p=Pattern.compile("\\d+");
String[] str=p.split("我的QQ是:456456我的電話是:0532214我的郵箱是:aaa@aaa.com");
運行結果:
str[0]="我的QQ是:" str[1]="我的電話是:" str[2]="我的郵箱是:aaa@aaa.com"
◆ 1.3 Pattern.matchers(String regex,CharSequence input)
該方法是一個靜態方法,用於快速匹配字符串,該方法將會匹配全部字符串
Pattern.matches("\\d+","2223");//返回true
Pattern.matches("\\d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,這里aa不能匹配到
Pattern.matches("\\d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,這里bb不能匹配到
二.Matcher
Matcher類提供三個匹配操作方法,三個方法均返回boolean類型,當匹配到時返回true,沒匹配到則返回false。
◆ 2.1 Matcher.matches()
matches()方法匹配的是整個字符串
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
m.matches();//返回false,因為bb不能被\d+匹配,導致整個字符串匹配未成功.
Matcher m2=p.matcher("2223");
m2.matches();//返回true,因為\d+匹配到了整個字符串
◆ 2.2 Matcher.lookingAt()
lookingAt()對最前面的字符串進行匹配,只有匹配到的字符串在最前面才返回true.
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
m.lookingAt();//返回true,因為\d+匹配到了前面的22
Matcher m2=p.matcher("aa2223");
m2.lookingAt();//返回false,因為\d+不能匹配前面的aa
◆ 2.3 Matcher.find()
對指定的字符串進行匹配,匹配到的字符串可以在任意位置。
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
m.find();//返回true
Matcher m2=p.matcher("aa2223");
m2.find();//返回true
Matcher m3=p.matcher("aa2223bb");
m3.find();//返回true
Matcher m4=p.matcher("aabb");
m4.find();//返回false
◆ 2.4 Matcher.start()
返回匹配到的子字符串在字符串中的起始位置。
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("aaa2223bb");
m.find();//匹配2223
m.start();//返回3
◆ 2.5 Matcher.end()
返回匹配到的子字符串的最后一個字符的下一個索引值。注意!是下一個索引值,而不是該子字符串中最后一個字符的索引值!
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("aaa2223bb");
m.find();//匹配2223
m.end();//返回7,返回的是2223后的索引號
◆ 2.6 Matcher.group()
group即返回匹配到的字符串。
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("aaa2223bb");
m.find();//匹配2223
m.group();//返回2223
◆ 2.6 Matcher.start(int, i), Matcher.end(int, i), Matcher.group(int, i), Matcher.groupCount()
前三個API主要用於分組操作,取出第i組數據的索引值,groupCount()則用來返回一共匹配到多少組。
Pattern p=Pattern.compile("([a-z]+)(\\d+)"); //()表示分組,意義是括號內是一個整體
Matcher m=p.matcher("aaa2223bb");
m.find(); //匹配aaa2223
m.groupCount(); //返回2,因為有2組
m.start(1); //返回0 返回第一組匹配到的子字符串在字符串中的索引號
m.start(2); //返回3
m.end(1); //返回3 返回第一組匹配到的子字符串的最后一個字符在字符串中的索引位置.
m.end(2); //返回7
m.group(1); //返回aaa,返回第一組匹配到的子字符串
m.group(2); //返回2223,返回第二組匹配到的子字符串
三. 使用正則表達式提取一段文本中的數字
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("我的QQ是:456456 我的電話是:0532214 我的郵箱是:aaa123@aaa.com");
while(m.find()) {
System.out.println(m.group());
}
運行結果:
456456
0532214
123
如果將while循環替換成
while(m.find()) { System.out.println(m.group()); System.out.print("start:"+m.start()); System.out.println(" end:"+m.end()); }
則輸出:
456456
start:6 end:12
0532214
start:19 end:26
123
start:36 end:39
注意!只有當匹配成功后,才可以使用start(), end(), group()方法,否則會拋出java.lang.IllegalStateException。也就是說,當matchers(), lookingAt(), find() 其中一個方法返回true時,才可以使用start(),end(),group()方法。
<完>
