从学javascript到java,从asp到asp.net,不管那种语言,正则都是我难于愈合的痛。今天晚上准备一刀切,搞定正则。
开始,翻书。《JDK 学习笔记》,《think in java 3th》。
java是在j2se 1.4之后支持正则的,在java.util.regex.Pattern类中有相关的正则表达式的信息。
下面的这些概念要记牢
- 特殊字符含义
<!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } -->
\xhh 十六进制\0xhh的字符 \uhhh 十六进制0xhhhh表示的Unicode字符 \t 制表符 \n 换行符 \r 回车 \f 换页 \e 转义
- 字符对比
方法 说明
. 符合任一个字符
\d 符合0-9任一个数字字符(digital)
\D 对 \d 取反
\s 符合\t, \n, \x0B, \f, \r等空格字符(space)
\w 只要是字母和数字都符合(word? 貌似不像,也不管了,就这样记忆吧)
\W 对 \w 取反
用split 来简单测试一下:
String text = "abcdebcadxbc";
String[] tokens = text.split(".bc");
for (String token : tokens) {
log(token);
}
结果:
(空格)
d
ad
怎么有空格呢!再试,这次把tokens的长度也码出来。
log(tokens.length);
结果:3。难道是匹配开头的也算?再试:
String[] tokenss = "xiaox".split(".iao");
for (String token : tokenss) {
log(token);
}
log(tokenss.length);
结果:
(空格)
x
2
果真。另外还发现一个问题,当split与字符不匹配时,返回一个长度为1的数组,而字符串就是第一个元素。
- 设置一组字符串的范围
范围 作用
[abc] 符合a,b,c其中一个字符
[^abc] 只要不是a,b,c这三个字符都符合
[a-zA-Z] 字符大小定都符合
[a-dm-p] 字符a-d或者d-m的字符都符合
[a-z&&[acd]] 字符acd其中一个与a-z字符的交集
[a-z&&[^bc]] 字符a-z与bc的差集,差不多意思就是bc除外的a-z的字符
上面的需要结合贪婪量词(JDK 5学习笔记 P127,专业词,不明白啥意思)来对字符串进行匹配。
- 贪婪量词
<!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } -->
范例 作用
X? X不出现或者一次
X* X出现或出现N次都匹配
X+ X至少出现一次才匹配
X{n} X需要出现n次才匹配
X{n,} X至少要出现n次才匹配,? X{1,} == X+
X{n, m} X出现的次数在n到m之间
- 逻辑运算符
<!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } -->
XY XY X|Y X或Y (X) 捕获组
- 边界匹配
<!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } -->
^ 一行的开始 $ 一行的结尾 \b 词界 \B 非词界 \G 上一级结尾