首页 > 代码库 > 正则表达式(一)

正则表达式(一)

技术分享

正则表达式的构造摘要(常用):      ------其他的构造请参看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

 

正则表达式(一)