Java 正则表达式全攻略(四)
labels:Java 正则表达式全攻略(四) java正则表达式 边界匹配器 分支
边界匹配器
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词边界 |
\B | 非单词边界 |
\A | 输入的开头 |
\G | 上一个匹配的结尾 |
\Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
\z | 输入的结尾 |
边界匹配和一般的正则表达式符号不同,它不匹配任何字符。相反,他们匹配的是字符之前或之后的位置;因此,你不可使用边界匹配器来捕获内容。 ^a 将会匹配字符串“abc”中的a。 ^b 将不会匹配“abc”中的任何字符。类似的,$匹配字符串中最后一个字符的后面的位置。所以 c$ 匹配“abc”中的c。
在日常工作中边界匹配是十分有用的。例如用户输入中,常常会有多余的前导空格或结束空格。你可以用 ^\s* 和 \s*$ 来匹配前导空格或结束空格。还有,如果你想检查一段对话内 Frank 这个名字出现了多少次,你可以使用 \bFrank\b 进行匹配,他不会把 Frank 和 Frankie 当成同一个人。
基本上边界匹配都比较容易理解,不过还有有些地方稍微注意一下的。
注意行结束符
行结束符是一个或两个字符的序列,标记输入字符序列的行结尾。以下代码被识别为行结束符:
- 新行(换行)符 ('\n' )、
- 后面紧跟新行符的回车符 ("\r\n" )、
- 单独的回车符 ('\r' )、
- 下一行字符 ('\u0085' )、
- 行分隔符 ('\u2028' ) 或
- 段落分隔符 ('\u2029 )。
如果你所要匹配的内容有多行,需要使用行边界配置,请不要忘记打开多行模式。因为默认情况下,正则表达式 ^ 和 $ 仅分别与整个输入序列的开头和结尾匹配。就拿下面一段代码来说,
1: String string = "This is\r\na test\r\nString." ;
2: Pattern p = Pattern.compile("^.+$" , Pattern.MULTILINE); // 打开多行匹配模式
3:
Matcher m = p.matcher(string);
4: while (m.find()) {
5: System.out.println("[" + m.group() + "]" );
6:
}
如果你没有打开多行配置模式,你将无法匹配任何内容。
此外,还需要注意的是 . 和行结束符的关系,如果未指定 DOTALL 标志的情况下,则正则表达式 . 可以与任何字符(行结束符除外)匹配。
分支的实现
正则表达式中“|”表示选择。你可以用选择符匹配多个可能的正则表达式中的一个。如果你想搜索文字“cat”或“dog”,你可以用 cat|dog 。选择符在正则表达式中具有最低的优先级,也就是说,它告诉引擎要么匹配选择符左边的所有表达式,要么匹配右边的所有表达式。你也可以用圆括号来限制选择符的作用范围。如 \b(cat|dog)\b ,这样告诉正则引擎把(cat|dog)当成一个正则表达式单位来处理。
注意个选择的顺序
\d{5}-\d{4}|\d{5} 这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。如果你把它改成 \d{5}|\d{5}-\d{4} 的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。