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个或多个不是[的字符