`
yysct2005
  • 浏览: 87580 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java 正则表达式全攻略(四)

    博客分类:
  • java
阅读更多

Java 正则表达式全攻略(四)

[ 2010-04-23 12:45:27.0 | 作者: 随想 类别: 基础强化 ] 来源:网络收集     浏览 2637
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位)。原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics