正则表达式的构造摘要(常用):      ------其他的构造请参看API-Pattern类

构造匹配
 
字符
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 的控制符
 
字符类
[abc] abc(简单类)
[^abc] 任何字符,除了 abc(否定)
[a-zA-Z] azAZ,两头的字母包括在内(范围)
[a-d[m-p]] admp[a-dm-p](并集)
[a-z&&[def]] def(交集)
[a-z&&[^bc]] az,除了 bc[ad-z](减去)
[a-z&&[^m-p]] az,而非 mp[a-lq-z](减去)
 
预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
 
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n
X{n,} X,至少 n
X{n,m} X,至少 n 次,但是不超过 m

正则表达式中反斜线字符 ('\') 用于引用转义构造。一般需要转义的字符有“\”,“.”,“?”,“*”,“+”。

正则表达式典型的调用顺序是

 Pattern p = Pattern.compile("a*b");
 Matcher m = p.matcher("aaaaab");
 boolean b = m.matches();

在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句

 boolean b = Pattern.matches("a*b", "aaaaab");

等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。

2.典型案例

  java中,“\\”匹配的正则表达式究竟是什么?“\\”?还是“\\\\”?

  这个问题的答案对于初学者来说很疑惑,即使有时候觉得理解了也还是有点模糊。下面说一下转义符“\”的处理。

  在java中,处理带有转义符的正则表达式时,我们先不要考虑java环境,先只考虑正则表达式的情况。

  比如上题“\\”匹配的正则表达式是什么其实就是问“\”匹配的正则表达式是什么,答案很明显是“\\”,因为在正则表达式中,“\”有特殊含义,所以要进行转义,故“\”匹配的正则表达式是“\\”

  然后我们考虑java环境,在java中,“\”也是转义符,表示字符“\”也需要加“\”,即“\\”,所以把刚才只考虑正则表达式的结果中的“\”换成“\\”,即“\\”匹配的正则表达式是“\\\\”

总结就是下面3步:

  java“\\”匹配的正则表达式是什么其实就是问

      “\”匹配的正则表达式是什么

  正则表达式中:

      “\”匹配的正则表达式是“\\”

  java中“\”是转义符,需要转义,所以java中:

      “\\”匹配的正则表达式是“\\\\”

3.Matcher中容易混淆的方法。

  matches()总是匹配整个字符串。

  find()从以前匹配操作没有匹配的第一个字符开始匹配。所以一定要注意之前有没有匹配。

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

以下是一个例子,注意一下m.reset()注释前和注释后的区别(注释之后会报错)

 1 import java.util.regex.Matcher;
 2 import java.util.regex.Pattern;
 3 
 4 
 5 public class RegexText {
 6 
 7     public static void main(String[] args) {
 8             Pattern p=Pattern.compile("\\d{3,5}");
 9             Matcher m=p.matcher("123-12345-00-123456");
10             System.out.println(m.matches());
11             
12             m.reset(); //重置匹配器。
13             
14             System.out.println("第一次find :"+m.find());
15             System.out.println(m.start()+"-"+m.end()); //展示匹配到的子串的开始和结束位置。end()返回最后匹配字符之后的偏移量,即比结束位置多1。而且如果m.find返回false,则start和end方法报错
16             System.out.println("第二次find :"+m.find());
17             System.out.println(m.start()+"-"+m.end());
18             System.out.println("第三次find :"+m.find());
19             System.out.println(m.start()+"-"+m.end());
20             System.out.println("第四次find :"+m.find());
21             System.out.println();
22             System.out.println("第一次lookingAt :"+m.lookingAt());
23             System.out.println("第二次lookingAt :"+m.lookingAt());
24             System.out.println("第三次lookingAt :"+m.lookingAt());
25             System.out.println("第四次lookingAt :"+m.lookingAt());
26     }
27 
28 }

 输出结果:

false
第一次find :true    //123-12345-00-123456
0-3
第二次find :true   //123-12345-00-123456
4-9
第三次find :true         //123-12345-00-123456
13-18
第四次find :false

第一次lookingAt :true
第二次lookingAt :true
第三次lookingAt :true
第四次lookingAt :true