正则表达式的构造摘要(常用): ------其他的构造请参看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] | a、b 或 c(简单类) |
[^abc] | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
[a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] | d、e 或 f(交集) |
[a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](减去) |
[a-z&&[^m-p]] | a 到 z,而非 m 到 p:[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