1. 非捕获组(?:)
/**
* 根据正则表达式找到字符串中符合条件的字符段,并输出到控制台
*/
public static void match(String regex, String str) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
非捕获组会输出整个正则表达式匹配到的内容,例如:a(?:b)c
,会输出匹配结果为:abc
。
正常使用时也可以省略?:
,例如:TEST-(?:[0-9]+)
可以直接写作TEST-([0-9]+)
。
public static void main(String[] args) throws Exception {
//输出结果:TEST-0918
match("^TEST-(?:[0-9]+)$", "TEST-0918");
//输出结果:无
match("^TEST-(?:[0-9]+)$", "TEST-0918-ABC");
//输出结果:TEST-0918
match("TEST-(?:[0-9]+)", "TEST-0918");
//输出结果:TEST-0918
match("TEST-([0-9]+)", "TEST-0918");
//输出结果:TEST-0918
match("TEST-(?:[0-9]+)", "TEST-0918-ABC");
//输出结果(找到两组符合要求的字符串):TEST-0918、TEST-1
match("TEST-(?:[0-9]+)", "TEST-0918-ABC-TEST-1");
}
2. 正向肯定预查(?=)
?=
只会输出匹配到的符合规则的正则前面部分结果,例如:abc(?=d)
,匹配结果为:abc
,不会输出?=d
中的d
。
public static void main(String[] args) throws Exception {
//输出结果:TEST-
match("TEST-(?=[0-9]+)", "TEST-0918");
}
3. 正向否定预查(?!)
?!
与?=
匹配规则类似,匹配结果都只是匹配的前面部分,?!
表示不符合后面表达式的结果,例如:abc(?!d)
,表示abc后面一个字符不是d的情况。
public static void main(String[] args) throws Exception {
//输出结果:无
match("TEST-(?![0-9]+)", "TEST-0918");
//输出结果:TEST-
match("TEST-(?![0-9]+)", "TEST-ABC");
}
4. 反向肯定预查(?<=)
?<=
表示反向肯定预查,匹配以某个正则开头的字符串,例如:(?<=a)bc
,表示匹配以a开头的bc字符串,匹配结果:bc
。
public static void main(String[] args) throws Exception {
//输出结果:TEST-
match("(?<=[0-9]+)-TEST", "0918-TEST");
//输出结果:无
match("(?<=[0-9]+)-TEST", "ABC-TEST");
}
5. 反向否定预查(?<!)
?<!
表示反向否定预查,匹配不以某个正则开头的字符串,例如:(?<!a)bc
,表示匹配不是以a开头的bc字符串,匹配结果:bc
。
public static void main(String[] args) throws Exception {
//输出结果:无
match("(?<![0-9]+)-TEST", "0918-TEST");
//输出结果:TEST-
match("(?<![0-9]+)-TEST", "ABC-TEST");
}
6. 其它正则匹配示例
- 匹配以
.txt
结尾的字符串:.*\\.txt
- 匹配不以
.txt
结尾并且以一位数字开头的字符串:(?!.*\.txt)[0-9].*
,其中(?!.*\.txt)
表示不以.txt
结尾,[0-9].*
表示以一位数字开头。