Java Pattern和Matcher用法


Java正則表達式通過java.util.regex包下的Pattern和Matcher類實現

Pattern類用於創建一個正則表達式,也可以說是創建一個匹配模式,可以通過兩個靜態方法創建:compile(String regex)和compile(String regex,int flags),其中regex是正則表達式,flags為可選模式(如:Pattern.CASE_INSENSITIVE 忽略大小寫)

實例:

Pattern pattern = Pattern.compile("Java");
System.out.println(pattern.pattern());//返回此模式的正則表達式即Java


Pattern類還有兩個根據匹配模式拆分輸入序列的方法:split(CharSequence input) 和split(CharSequence input, int limit),其中limit為返回元素的個數。

實例:

Pattern pattern = Pattern.compile("Java");
String test="123Java456Java789Java";
String[] result = pattern.split(test);
for(String s : result)
System.out.println(s);

結果:

123
456
789

 

再細說一下split(CharSequence input, int limit),當limit值大於所能返回的字符串的最多個數或者為負數,返回的字符串個數將不受限制,但結尾可能包含空串,而當limit=0時與split(CharSequence input)等價,但結尾的空串會被丟棄。

Pattern pattern = Pattern.compile("Java");
String test = "123Java456Java789Java";

String[] result = pattern.split(test,2);
for(String s : result)
System.out.println(s);

result = pattern.split(test,10);
System.out.println(result.length);

result = pattern.split(test,-2);
System.out.println(result.length);

result = pattern.split(test,0);
System.out.println(result.length);

運行結果:

123
456Java789Java
4
4
3

 

Pattern類也自帶一個靜態匹配方法matches(String regex, CharSequence input),但只能進行全字符串匹配並且只能返回是否匹配上的boolean值

實例:

String test1 = "Java";
String test2 = "Java123456";

System.out.println(Pattern.matches("Java",test1));//返回true
System.out.println(Pattern.matches("Java",test2));//返回false

 

最后就要過渡到Matcher類了,Pattern類中的matcher(CharSequence input)會返回一個Matcher對象。

Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持,要想得到更豐富的正則匹配操作,那就需要將Pattern與Matcher聯合使用。

實例:

Pattern pattern = Pattern.compile("Java");
String test = "123Java456Java789Java";
Matcher matcher = pattern.matcher();

 

Matcher類提供了三個返回boolean值得匹配方法:matches(),lookingAt(),find(),find(int start),其中matches()用於全字符串匹配,lookingAt從字符串最開頭開始匹配滿足的子串,find可以對任意位置字符串匹配,其中start為起始查找索引值。

實例

Pattern pattern = Pattern.compile("Java");
String test1 = "Java";
String test2 = "Java1234";
String test3 = "1234Java"
Matcher matcher = pattern.matcher(test1);
System.out.println(matcher.matches());//返回true
matcher = pattern.matcher(test2);
System.out.println(matcher.matches());//返回false

matcher = pattern.matcher(test2);
System.out.println(matcher.lookingAt())://返回true
matcher = pattern.matcher(test3);
System.out.println(matcher.lookingAt());//返回false

matcher = pattern.matcher(test1);
System.out.println(matcher.find());//返回true
matcher = pattern.matcher(test2);
System.out.println(matcher.find());//返回true
matcher = pattern.matcher(test3);
System.out.println(matcher.find(2));//返回true
matcher = pattern.matcher(test3);
System.out.println(matcher.find(5));//返回false

 

這里介紹下組的概念:組是用括號划分的正則表達式,可以根據組的編號來引用這個組。組號為0表示整個表達式,組號為1表示被第一對括號括起的組,依次類推,例如A(B(C))D,組0是ABCD,組1是BC,組2是C。

Matcher類提供了start(),end(),group()分別用於返回字符串的起始索引,結束索引,以及匹配到到的字符串。

實例:

Pattern pattern = Pattern.compile("Java");
String test = "123Java456";

Matcher matcher = pattern.matcher(test);
matcher.find();
System.out.println(matcher.start());//返回3
System.out.println(matcher.end());//返回7
System.out.println(matcher.group());//返回Java

 

Matcher類提供了start(int gropu),end(int group),group(int i),groupCount()用於分組操作

實例:

Pattern pattern = Pattern.compile("(Java)(Python)");
String test = "123JavaPython456";
Matcher matcher = pattern.matcher(test);
matcher.find();
System.out.println(matcher.groupCount());//返回2

System.out.println(matcher.group(1));//返回第一組匹配到的字符串"Java",注意起始索引是1
System.out.println(matcher.start(1));//返回3,第一組起始索引
System.out.println(matcher.end(1));//返回7 第一組結束索引

System.out.println(matcher.group(2));//返回第二組匹配到的字符串"Python"
System.out.println(matcher.start(2));//返回7,第二組起始索引
System.out.println(matcher.end(2));//返回13 第二組結束索引

 

Matcher類還提供region(int start, int end)(不包括end)方法用於設定查找范圍,並提供regionStrat()和regionEnd()用於返回起始和結束查找的索引

Pattern pattern = Pattern.compile("Java");
String test = "123JavaJava";
Matcher matcher = pattern.matcher(test);
matcher.region(7, 11);
System.out.println(matcher.regionStart());//返回7
System.out.println(matcher.regionEnd());//返回11
matcher.find();
System.out.println(matcher.group());//返回Java

 

Matcher類提供了兩種用於重置當前匹配器的方法:reset()和reset(CharSequence input)

Pattern pattern = Pattern.compile("Java");
String test = "Java";
Matcher matcher = pattern.matcher(test);

matcher.find();
System.out.println(matcher.group());//返回Java

matcher.reset();//從起始位置重新匹配

matcher.find();
System.out.println(matcher.group());//返回Java

matcher.reset("Python");
System.out.println(matcher.find());//返回false

 

最后說一下Matcher類的匹配方法:replaceAll(String replacement) 和 replaceFirst(String replacement),其中replaceAll是替換全部匹配到的字符串,而replaceFirst僅僅是替換第一個匹配到的字符串。

Pattern pattern = Pattern.compile("Java");
String test = "JavaJava";
Matcher matcher = pattern.matcher(test);
System.out.println(matcher.replaceAll("Python"));//返回PythonPython
System.out.println(matcher.replaceFirst("python"));//返回PythonJava

 

還有兩個方法appendReplacement(StringBuffer sb, String replacement) 和 appendTail(StringBuffer sb)也很重要,appendReplacement允許直接將匹配的字符串保存在另一個StringBuffer中並且是漸進式匹配,並不是只匹配依次或匹配全部,而appendTail則是將未匹配到的余下的字符串添加到StringBuffer中。

Pattern pattern = Pattern.compile("Java");
Matcher matcher = pattern.matcher("Java1234");

System.out.println(matcher.find());//返回true
StringBuffer sb = new StringBuffer();

matcher.appendReplacement(sb, "Python");
System.out.println(sb);//輸出Python

matcher.appendTail(sb);
System.out.println(sb);//輸出Python1234

 

---------------------

摘抄學習,出處如下:
作者:Java.Sheng
來源:CSDN
原文:https://blog.csdn.net/woaigaolaoshi/article/details/50970527


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM