JAVA 正则表达式陈广佳版本(超详细)

2020-03-05 18:01:51王振洲

find( )

Matcher.find( )的功能是发现CharSequence里的,与pattern相匹配的多个字符序列。例如:

 java.util.regex.*;
 com.bruceeckel.simpletest.*;
 java.util.*;
 FindDemo {
 Test monitor = Test();
 main(String[] args) {
 Matcher m = Pattern.compile()
 .matcher();
(m.find())
 System.out.println(m.group());
 i = 0;
(m.find(i)) {
 System.out.print(m.group() + );
 i++;
 }
 monitor.expect( String[] {
,
,
,
,
,
,
,
,
 +
 +

 });
 }
} 

"//w+"的意思是"一个或多个单词字符",因此它会将字符串直接分解成单词。find( )像一个迭代器,从头到尾扫描一遍字符串。第二个find( )是带int参数的,正如你所看到的,它会告诉方法从哪里开始找——即从参数位置开始查找。

Groups

Group是指里用括号括起来的,能被后面的表达式调用的正则表达式。Group 0 表示整个表达式,group 1表示第一个被括起来的group,以此类推。所以;

A(B(C))D

里面有三个group:group 0是ABCD, group 1是BC,group 2是C。

你可以用下述Matcher方法来使用group:

public int groupCount( )返回matcher对象中的group的数目。不包括group0。

public String group( ) 返回上次匹配操作(比方说find( ))的group 0(整个匹配)

public String group(int i)返回上次匹配操作的某个group。如果匹配成功,但是没能找到group,则返回null。

public int start(int group)返回上次匹配所找到的,group的开始位置。

public int end(int group)返回上次匹配所找到的,group的结束位置,最后一个字符的下标加一。

java.util.regex.*;
 com.bruceeckel.simpletest.*;
 Groups {
 Test monitor = Test();
 String poem =
 +
 +
 +
 +
 +
 +
 +
;
 main(String[] args) {
 Matcher m =
 Pattern.compile()
 .matcher(poem);
(m.find()) {
( j = 0; j <= m.groupCount(); j++)
 System.out.print( + m.group(j) + );
 System.out.println();
 }
 monitor.expect( String[]{
 +
,
,
 +
,
 +
,
 +
,
 +
,
,
 +

 });
 }
}

这首诗是Through the Looking Glass的,Lewis Carroll的"Jabberwocky"的第一部分。可以看到这个正则表达式里有很多用括号括起来的group,它是由任意多个连续的非空字符('/S+')和任意多个连续的空格字符('/s+')所组成的,其最终目的是要捕获每行的最后三个单词;'$'表示一行的结尾。但是'$'通常表示整个字符串的结尾,所以这里要明确地告诉正则表达式注意换行符。这一点是由'(?m)'标志完成的(模式标志会过一会讲解)。

start( )和end( )

如果匹配成功,start( )会返回此次匹配的开始位置,end( )会返回此次匹配的结束位置,即最后一个字符的下标加一。如果之前的匹配不成功(或者没匹配),那么无论是调用start( )还是end( ),都会引发一个IllegalStateException。下面这段程序还演示了matches( )和lookingAt( ):