1 语法
在使用正则表达式的各种程序和类库之间,表达式语法并未完全标准化。
1.1 字符
- 字符类是一个括在括号中的可选择的字符集,例如,[Jj]、[0-9]、[A-Za-z]或 1。这里“-”表示是一个范围,而 ^ 表示补集。
- 如果字符类中包含
-
,必须第一项或最后一项;如果包含[
,必须第一项;包含^
,不能开始位置。其中,你只需要转义[
和\
。 - 有许多预定的字符类,例如
\d
(数字)和\p{Sc}
(Unicode货币符号)。
1.2 边界
.
符号可以匹配任何字符。- 使用
\
作为转义字符,例如,\.
匹配句号而\\
匹配反斜线。 ^
和$
分别匹配一行的开头和结尾。- 如果X和Y是正则表达式,那么XY表示“任何X的匹配后面跟随Y的匹配”,
X | Y
表示“任何X或Y的匹配”。
1.3 量词
- 量词:X+(1个或多个)、X*(0 个或多个)与 X?(0 个或 1 个)。
- 量词默认匹配最大重复次数。可以修改,使用吝啬匹配(后缀?)匹配最小的重复次数,或使用贪婪匹配(后缀+),即使让整个匹配失败,也要匹配最大的重复次数。
1.4 群组
- 我们使用群组来定义子表达式,其中群组用括号
()
括起来。例如,([+-]?)([0-9]+)
。然后你可以询问模式匹配器,让其返回每个组的匹配,或者用 n 来引用某个群组,其中 n 是群组号(从 1 开始)。
2 使用
2.1 匹配
首先用正则表达式的字符串构建一个 Pattern 对象,然后从这个模式中获得一个 Matcher,并调用他的 matches 方法。
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(input);
if(matcher.matches()) ...
1)编译标志
在编译这个表达式时,可以设置一个或多个标志
Pattern pattern = Pattern.compile(expression,Pattern.CASE_INTENSIVE + Pattern.UNICODE_CASE);
或在表达式中指定:
String regex = "(?iU:expression)";
各个标志:
- Pattern.CASE_INSENSITIVE 或 r:忽略字母大小写,默认只考虑 US ASCII 字符。
- Pattern.UNICODE_CASE 或 u:与 CASE_INSENSITIVE 组合使用,用 Unicode 字母匹配大小写。
- Pattern.UNICODE_SHARACTER_CLASS 或 U:选择 Unicode 字符类代替 POSIX,其中蕴含了 UNICODE_CASE;
- Pattern.MULTILINE 或 m:
^
和$
匹配行的开头和结尾,而不是整个输入的开头和结尾。 - Pattern.UNIX_LINES 或 d: 在多行模式中匹配
^
和$
时,只有\n
被识别成行终止符。 - Pattern.DOTALL 或 s:
.
符号匹配所有字符,包括行终止符。 - Pattern.LITERAL: 逐字采纳,精确匹配,字母大小差异除外。
- Pattern.CANON_EQ: 考虑 Unicode 字符规范的等价性
2)匹配集合或流
如果想要在集合或流中匹配元素,可以将模式转换为谓词:
Stream<String> strings = ...;
Stream<String> result = strings.fiter(pattern.asPredicate());
其结果中包含了匹配正则表达式的所有字符串。
3)匹配群组
如果正则表达式包含群组,那么Matcher对象可以揭示群组的边界。下面的方法
int start(int groupIndex)
int end(int groupIndex)
将产生指定群组的开始索引和结束之后的索引。
4)抽取匹配
可以直接通过调用下面的方法抽取匹配的字符串
群组 0 是整个输入,而用于第一个实际群组的群组索引是 1。
String group(int groupIndex)
2.2 查找
使用 Matcher 类的 find 方法来查找匹配内容,如果返回 true,在使用 start 和 end 方法来查找匹配的内容,或使用不带引元的 group 方法来获取匹配的字符串。
whiel(matcher.find()){
int start = matcher.start();
int end = matcher.end();
String match = input.group();
}
2.3 替换
Matcher 类的 replaceAll 方法将正则表达式出现的所有地方都用替换字符串来替换。
Matcher 类的 replaceFirst 方法将只替换模式的第一次出现。
2.4 分割
最后,Pattern 类有一个 split 方法,它可以用正则表达式来匹配边界,从而将输入分割成字符串数组。