1  (?i) ascii的忽略大小写;(?m)多行即^和$会匹配每行的开始和结束.(?s) sigle line 在这种模式下 .匹配行结束符

2  Matcher 的 start( )和end( )

start( )会返回此次匹配的开始位置,end( )会返回此次匹配的结束位置,即最后一个匹配字符的下标加一  

(用自然的角度想这是应该+1的)

3  boolean从某个下标开始是否模式匹配整个input

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的结束位置,最后一个字符的下标加一。

Pattern p = Pattern.compile("^java", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);

4 appendReplacement和appendTail 及String.replaceAll()中的$1

-------------------------------分割线--------------------------------------------------------------------------------

String s="Note that we'll first extract the block of text by looking for/n"+
 " the special delimiters, then process the extracted block.";
 StringBuffer sbuf = new StringBuffer();
 Pattern p = Pattern.compile("[aeiou]");
 Matcher m = p.matcher(s); 
 while(m.find())
 m.appendReplacement(sbuf, m.group().toUpperCase());
 m.appendTail(sbuf);
 System.out.println(sbuf);


执行结果
NOtE thAt wE'll fIrst ExtrAct thE blOck Of tExt by lOOkIng fOr 

thE spEcIAl dElImItErs, thEn prOcEss thE ExtrActEd blOck.

你还可以在appendReplacement( )的replacement参数里用"$g"引用已捕获的group,其中'g' 表示group的号码。

---------------------------------分割线---------------------------------------------------------

start()

2 它将给定替换字符串添加到字符串缓冲区。

   3 它将此匹配器的添加位置设置为最后匹配位置的索引加 1,即 end()

 

$g 每次出现时,都将被 group(g) 的计算结果替换。$ 之后的第一个数始终被视为组引用的一部分。如果后续的数可以形成合法组引用,则将被合并到 g 中。只有数字 '0' 到 '9' 被视为组引用的可能组件。例如,如果第二个组匹配字符串 "foo",则传递替换字符串 "$2bar" 将导致 "foobar" 被添加到字符串缓冲区。可能将美元符号 ($) 作为替换字符串中的字面值(通过前面使用一个反斜线 (/$))包括进来。

5 reset( )

此外,还可以用reset( )方法给现有的Matcher对象配上个新的CharSequence。 m.reset("fix the rig with rags");

 

6 关于非捕获组

(?=X) X, via zero-width positive lookahead (?!X) X, via zero-width negative lookahead (?<=X)X, via zero-width positive lookbehind (?<!X)X, via zero-width negative lookbehind

 

注意例子

 

去掉[zz] [/zz]中间的字符
当然,[zz]是可以自定义的。可以换成[xieti] [/xieti]

 

String str = "[zz]neighboring [/zz]Jing'an districe"; 
String regex = "(?i)(?<=//[zz//])[^//[]*(?=//[/zz//])"; 
System.out.println(str.replaceAll(regex, ""));

 

还是容易理解的注意中间的[^//[]*   代表0个或多个不是[的字符