一、概述


 


正则表达式是Java处理字符串、文本的重要工具。 自从jdk1.4推出java.util.regex包,就为我们提供了很好的JAVA正则表达式应用平台。


 


Java对正则表达式的处理集中在以下两个两个类:


java.util.regex.Matcher   模式类:用来表示一个编译过的正则表达式。


java.util.regex.Pattern   匹配类:用模式匹配一个字符串所表达的抽象结果。


(很遗憾,Java Doc并没有给出这两个类的职责概念。)


 


二、一些容易迷糊的问题


 


1、Java对反斜线处理的问题


 


在其他语言中,\\表示要插入一个字符\;


在Java语言中,\\表示要插入正则表达式的反斜线,并且后面的字符有特殊意义。


 


看API文档:


预定义字符类


. 任何字符(与行结束符可能匹配也可能不匹配)


\d 数字:[0-9]


\D 非数字: [^0-9]


\s 空白字符:[ \t\n\x0B\f\r]


\S 非空白字符:[^\s]


\w 单词字符:[a-zA-Z_0-9]


\W 非单词字符:[^\w]
/b 一个单词的边界
/B 一个非单词的边界
/G 前一个匹配的结束


 

 

在Java正则表达式中,如果要插入一个\字符,则需要在正则表达式中写成 \\\\ ,原因是下面的APIDoc定义\\表示一个反斜线。


但是如果在正则表示式中表示回车换行等,则不需要多添加反斜线了。比如回车\r就写作\r.


 


字符


x 字符 x


\\ 反斜线字符


\0n 带有八进制值 0 的字符 n (0 <= n <= 7)


\0nn 带有八进制值 0 的字符 nn (0 <= n <= 7)


\0mnn 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)


\xhh 带有十六进制值 0x 的字符 hh


\uhhhh 带有十六进制值 0x 的字符 hhhh


\t 制表符 ('\u0009')


\n 新行(换行)符 ('\u000A')


\r 回车符 ('\u000D')


\f 换页符 ('\u000C')


\a 报警 (bell) 符 ('\u0007')


\e 转义符 ('\u001B')


\cx 对应于 x 的控制符

^为限制开头
^java     条件限制为以Java为开头字符
$为限制结尾
java$     条件限制为以java为结尾字符
.  条件限制除/n以外任意一个单独字符
java..     条件限制为java后除换行外任意两个字符


加入特定限制条件「[]」
[a-z]     条件限制在小写a to z范围中一个字符
[A-Z]     条件限制在大写A to Z范围中一个字符
[a-zA-Z] 条件限制在小写a to z或大写Ato Z范围中一个字符
[0-9]     条件限制在小写0 to 9范围中一个字符
[0-9a-z] 条件限制在小写0 to 9或ato z范围中一个字符
[0-9[a-z]] 条件限制在小写0 to 9或ato z范围中一个字符(交集)

[]中加入^后加再次限制条件「[^]」
[^a-z]     条件限制在非小写ato z范围中一个字符
[^A-Z]     条件限制在非大写Ato Z范围中一个字符
[^a-zA-Z] 条件限制在非小写a to z或大写Ato Z范围中一个字符
[^0-9]     条件限制在非小写0to 9范围中一个字符
[^0-9a-z] 条件限制在非小写0 to 9或ato z范围中一个字符
[^0-9[a-z]] 条件限制在非小写0 to 9或ato z范围中一个字符(交集)

在限制条件为特定字符出现0次以上时,可以使用「*」
J*     0个以上J
.*     0个以上任意字符
J.*D     J与D之间0个以上任意字符

在限制条件为特定字符出现1次以上时,可以使用「+」
J+     1个以上J
.+     1个以上任意字符
J.+D     J与D之间1个以上任意字符

在限制条件为特定字符出现有0或1次以上时,可以使用「?」
JA?     J或者JA出现

限制为连续出现指定次数字符「{a}」
J{2}     JJ
J{3}     JJJ
文字a个以上,并且「{a,}」
J{3,}     JJJ,JJJJ,JJJJJ,???(3次以上J并存)
文字个以上,b个以下「{a,b}」
J{3,5}     JJJ或JJJJ或JJJJJ
两者取一「|」
J|A     J或A
Java|Hello     Java或Hello
 
「()」中规定一个组合类型
比如,我查询<ahref=/"index.html/">index</a>中<ahref></a>间的数据,可写作<a.*href=/".*/">(.+?)</a>


 


2、Matcher.find():尝试查找与模式匹配的字符序列的下一个子序列。此方法从字符序列的开头开始,如果该方法的前一次调用成功了并且从那时开始匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始,即如果前一次找到与模式匹配的子序列则这次从这个子序列后开始查找。


 


3、Matcher.matchers():判断整个字符序列与模式是否匹配。当连续用Matcher对象检查多个字符串时候,可以使用


Matcher.reset():重置匹配器,放弃其所有显式状态信息并将其添加位置设置为零。


或者Matcher.reset(CharSequence input)  重置此具有新输入序列的匹配器。


来重复使用匹配器。


 


组号从0开始,有几对小括号就表示有几个组,并且组可以嵌套,组号为0的表示整个表达式,组号为1的表示第一个组,依此类推。


例如:A(B)C(D)E正则式中有三组,组0是ABCDE,组1是B,组2是D;


A((B)C)(D)E正则式中有四组:组0是ABCDE,组1是BC,组2是B;组3是C,组4是D。


 


int groupCount():返回匹配其模式中组的数目,不包括第0组。


String group():返回前一次匹配操作(如find())的第0组。


String group(int group):返回前一次匹配操作期间指定的组所匹配的子序列。如果该匹配成功,但指定组未能匹配字符序列的任何部分,则返回 null。


int start(int group):返回前一次匹配操作期间指定的组所匹配的子序列的初始索引。


int end(int group):返回前一次匹配操作期间指定的组所匹配的子序列的最后索引+1。


 


5、匹配的范围的控制


名字很让人迷惑,需要认真看APIDoc。


 


start()  返回以前匹配的初始索引。


end()  返回最后匹配字符之后的偏移量。


 


public boolean lookingAt()尝试将从区域开头开始的输入序列与该模式匹配。


与 matches 方法类似,此方法始终从区域的开头开始;与之不同的是,它不需要匹配整个区域。


如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。


返回:


当且仅当输入序列的前缀匹配此匹配器的模式时才返回 true。


 



 


三、字符串的替换


 


String.replace(char oldChar, char newChar)


          返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的。


String.replace(CharSequence target, CharSequence replacement)


          使用指定的字面值替换序列替换此字符串匹配字面值目标序列的每个子字符串。


String.replaceAll(String regex, String replacement)


          使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的每个子字符串。


String.replaceFirst(String regex, String replacement)


          使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的第一个子字符串。


 


StringBuffer.replace(int start, int end, String str)


          使用给定 String 中的字符替换此序列的子字符串中的字符。


StringBuilder.replace(int, int, java.lang.String)


          使用给定 String 中的字符替换此序列的子字符串中的字符。


 


Matcher.replaceAll(String replacement)


          替换模式与给定替换字符串相匹配的输入序列的每个子序列。


Matcher.replaceFirst(String replacement)


          替换模式与给定替换字符串匹配的输入序列的第一个子序列。


 


四、字符串的切分


 


 String[] split(String regex)


          根据给定的正则表达式的匹配来拆分此字符串。


 String[] split(String regex, int limit)


          根据匹配给定的正则表达式来拆分此字符串。


  


当然,还有一个StringTokenizer类,可以用来切分字符串,但是现在SUN已经不推荐使用了。

转变下思路,其实用正则表达式也可以达到将字符串切分为段的目的