正则表达式

Java 中正则表达式

Java 中也支持正则表达式。常用到的是以下内容:

  • String 类的 split 方法。
  • java.util.regex 的 Pattern Matcher 对象
  • StringTokenizer 类(基本已经弃用)

表达式基础

正则表达式中常用的匹配有一下:

  • ‘.’ 匹配任意字符
  • ‘\d’ 匹配数组 [0-9]
  • ‘\D’ 匹配非数字 [ ^0-9]
  • ‘\w’ 词字符 [a-zA-Z0-9]
  • ‘\W’ 非词字符
  • ‘\s’ 空白符(空格,tab,换行,换页,回车)
  • ‘\S’ 非空白符

需要注意的是:在 Java 中,\ 代表着一个转译符,所以在正则表达式中想要表达 \s 的话需要在反斜杠前在加行一个反斜杠,就变成了 \\s。同理,如果想在正则表达式中表达一个普通的 \ 首先先要一个反斜杠来转译,同时这两个反斜杠,同样也需要转移,所以 Java 正则表达式中 \\\\ 代表着一个 \

例子:

n\\w+ 的匹配规则就是:匹配字母 n 以后跟着一个或多个词字符。

‘n123’ 和 ‘next’ 都能匹配。而 ’n 123‘ 就无法匹配了。

量词

正则表达式一般有两中模式来匹配文本:

  • 贪婪型:贪婪的表达式会尽可能多的匹配。
  • 勉强型:勉强型的表达式会尽可能少的匹配。
贪婪型 勉强型 如何匹配
X? X?? 一个或零个X
X* X*? 零个或多个X
X+ X+? 一个或多个X
X{n} X{n}? 恰好n次X
X{n,} X{n,}? 至少n次
X{n,m} X{n,m}? X至少n次,但是不超过m次

正则表达式通过通过圆括号来分组,以便能达到我们预期的结果,列如:

abc+

看起来似乎应该匹配,一个或多个 abc 序列。如果匹配的是字符串 abcabcabc ,实际上会获得 3 个匹配。这个表达式实际上匹配的是 ab,后面跟着 1 个或多个 C

正确的匹配一个或多个 abc 正确的的表达式应该是:

(abc)+

java 中使用正则表达式

在 Java 程序中导入 java.util.regex 包。然后使用 static Pattern.compile() 方法来编译正则表达式。该方法返回一个 Pattern 对象。接下来,将想要匹配的字符串传入 Pattern 对象的 matcher(String s) 方法中,得到一个 Matcher 对象。

Matcher 中常用的方法:

  • find() 返回是否还有能匹配的值,类似迭代器 hasNext() 方法
  • group() 组是用括号划分的正则表达式的匹配结果,没有传入代表当前的结果。组号 0 代表整个表达式。
  • start()end() 代表匹配到的开始和结束。