JAVA:正则表达式匹配
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].*表示以一位数字开头。

浙公网安备 33010602011771号