\b | 回退(并删除)一个字符(Backspace键) |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符(Tab键) |
\v | 垂直制表符 |
来看一个例子,把文件中的空白行去掉:
文本:
8 5 4 1 6 3 2 7 9
7 6 2 9 5 8 3 4 1
9 3 1 4 2 7 8 5 6
6 9 3 8 7 5 1 2 4
5 1 8 3 4 2 6 9 7
2 4 7 6 1 9 5 3 8
3 26 7 8 4 9 1 5
4 8 9 5 3 1 7 6 2
1 7 5 2 9 6 4 8 3
正则表达式:\r\n\r\n
分析:\r\n匹配一个回车+换行组合,windows操作系统中把它作为文本行的结束标签。使用正则表达式\r\n\r\n进行的搜索将匹配两个连续的行尾标签,而这正好是空白行。
注意:Unix和Linux操作系统中只使用一个换行符来结束一个文本行,换句话说,在Unix或Linux系统中匹配空白行只使用\n\n即可,不需要加上\r。同时适用于windows和Unix/Linux的正则表达式应该包括一个可先的\r和一个必须匹配的\n,即\r?\n\r?\n,这将会在后面的文章中讲到。
Java代码如下:
public static void matchBlankLine() throws Exception{ BufferedReader br = new BufferedReader(new FileReader(new File("E:/九宫格.txt"))); StringBuilder sb = new StringBuilder(); char[] cbuf = new char[1024]; int len = 0; while(br.ready() (len = br.read(cbuf)) > 0){ br.read(cbuf); sb.append(cbuf, 0, len); } String reg = "\r\n\r\n"; System.out.println("原内容:\n" + sb.toString()); System.out.println("处理后:-----------------------------"); System.out.println(sb.toString().replaceAll(reg, "\r\n")); }
运行结果如下:
原内容: 8 5 4 1 6 3 2 7 9 7 6 2 9 5 8 3 4 1 9 3 1 4 2 7 8 5 6 6 9 3 8 7 5 1 2 4 5 1 8 3 4 2 6 9 7 2 4 7 6 1 9 5 3 8 3 2 6 7 8 4 9 1 5 4 8 9 5 3 1 7 6 2 1 7 5 2 9 6 4 8 3 处理后:----------------------------- 8 5 4 1 6 3 2 7 9 7 6 2 9 5 8 3 4 1 9 3 1 4 2 7 8 5 6 6 9 3 8 7 5 1 2 4 5 1 8 3 4 2 6 9 7 2 4 7 6 1 9 5 3 8 3 2 6 7 8 4 9 1 5 4 8 9 5 3 1 7 6 2 1 7 5 2 9 6 4 8 3
三、匹配特定的字符类别
字符集合(匹配多个字符中的某一个)是最常见的匹配形式,而一些常用的字符集合可以用特殊元字符来代替。这些元字符匹配的是某一类别的字符(类元字符),类元字符并不是必不可少的,因为可以通过逐一列举有关字符或通过定义一个字符区间来匹配某一类字符,但是使用它们构造出来的正则表达式简明易懂,在实际应用中很常用。
1、匹配数字与非数字
\d 任何一个数字,等价于[0-9]或[0123456789]
\D 任何一个非数字,等价于[^0-9]或[^0123456789]
2、匹配字母和数字与非字母和数字
字母(A-Z不区分大小写)、数字、下划线是一种常用的字符集合,可用如下类元字符:
\w 任何一个字母(不区分大小写)、数字、下划线,等价于[0-9a-zA-Z_]
\W 任何一个非字母数字和下划线,等价于[^0-9a-zA-Z_]
3、匹配空白字符与非空白字符
\s 任何一下空白字符,等价于[\f\n\r\t\v]
\S 任何一下空白字符,等价于[^\f\n\r\t\v]
注意:退格元字符\b没有不在\s的范围之内。
4、匹配十六进制或八进制数值
十六进制:用前缀\x来给出,如:\x0A对应于ASCII字符10(换行符),其效果等价于\n。
八进制:用前缀\0来给出,数值本身可以是两位或三位数字,如:\011对应于ASCII字符9(制表符),其效果等价于\t。
四、使用POSIX字符类
POSIX字符类是很多正则表达式实现都支持的一种简写形式。Java也支持它,但JavaScript不支持。POSIX字符如下所示:
[:alnum:] | 任何一个字母或数字,等价于[a-zA-Z0-9] |
[:alpha:] | 任何一个字母,等价于[a-zA-Z] |
[:blank:] | 空格或制表符,等价于[\t] |
[:cntrl:] | ASCII控制字符(ASCII 0到31,再加上ASCII 127) |
[:digit:] | 任何一个数字,等价于[0-9] |
[:graph:] | 任何一个可打印字符,但不包括空格 |
[:lower:] | 任何一个小写字母,等价于[a-z] |
[:print:] | 任何一个可打印字符 |
[:punct:] | 既不属于[:alnum:]和[:cntrl:]的任何一个字符 |
[:space:] | 任何一个空白字符,包括空格,等价于[^\f\n\r\t\v] |
[:upper:] | 任何一个大写字母,等价于[A-Z] |
[:xdigit:] | 任何一个十六进制数字,等价于[a-fA-F0-9] |
POSIX字符和之前见过的元字符不太一样,我们来看一个前面利用正则表达式来匹配网页中的颜色的例子:
文本:span style="background-color:#3636FF;height:30px;width:60px;">测试/span>
正则表达式:#[[:xdigit:]] [[:xdigit:]] [[:xdigit:]] [[:xdigit:]] [[:xdigit:]] [[:xdigit:]]
结果:span style="background-color:【#3636FF】;height:30px;width:60px;">测试/span>
注意:这里使用的模式以[[开头、以]]结束,这是使用POSIX字符类所必须的,POSIX字符必须括在[:和:]之间,外层[和]字符用来定义一个集合,内层的[和]字符是POSIX字符类本身的组成部分。
在java中的POSIX字符表示有所不同,不是包括在[:和:]之间,而是以\p开头,包括在{和}之间,且大小写有区别,同时增加了\p{ASCII},如下所示:
\p{Alnum} | 字母数字字符:[\p{Alpha}\p{Digit}] |
\p{Alpha} | 字母字符:[\p{Lower}\p{Upper}] |
\p{ASCII} | 所有 ASCII:[\x00-\x7F] |
\p{Blank} | 空格或制表符:[ \t] |
\p{Cntrl} | 控制字符:[\x00-\x1F\x7F] |
\p{Digit} | 十进制数字:[0-9] |
\p{Graph} | 可见字符:[\p{Alnum}\p{Punct}] |
\p{Lower} | 小写字母字符:[a-z] |
\p{Print} | 可打印字符:[\p{Graph}\x20] |
\p{Punct} | 标点符号:!"#$%'()*+,-./:;=>?@[\]^_`{|}~ |
\p{Space} | 空白字符:[ \t\n\x0B\f\r] |
\p{Upper} | 大写字母字符:[A-Z] |
\p{XDigit} | 十六进制数字:[0-9a-fA-F] |
PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:
JavaScript正则表达式在线测试工具:
http://tools.jb51.net/regex/javascript
正则表达式在线生成工具:
http://tools.jb51.net/regex/create_reg
希望本文所述对大家正则表达式学习有所帮助。
上一篇:正则表达式教程之匹配一组字符详解
下一篇:正则表达式教程之重复匹配详解