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()
代表匹配到的开始和结束。