java 正则表达式 易忘点 疑难点

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

2  Matcher 的 start( )和end( )

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

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

3  boolean lookingAt() 从某个下标开始是否模式匹配整个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的号码。
---------------------------------分割线---------------------------------------------------------
实现非终端添加和替换步骤。 此方法执行以下操作: 
   1  它从添加位置开始在输入序列读取字符,并将其添加到给定字符串缓冲区。在读取以前匹配之前的最后字符(即位于索引 start() - 1 处的字符)之后,它就会停止。 
   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个或多个不是[的字符


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值