Special constructs (named-capturing and non-capturing)
(?<name>X) X, as a named-capturing group
(?:X) X, as a non-capturing group
(?idmsuxU-idmsuxU) Nothing, but turns match flags i d m s u x U on - off
(?idmsux-idmsux:X) X, as a non-capturing group with the given flags i d m s u x on - off
(?=X) X, via zero-width positive lookahead
(?!X) X, via zero-width negative lookahead
(?<=X) X, via zero-width positive lookbehind
(?<!X) X, via zero-width negative lookbehind
(?>X) X, as an independent, non-capturing group
特殊构造(命名捕获组 和 非捕获组)
(?<name>X)
X, 作为一个命名捕获组, 匹配到正则X的组可以根据组名name取到。
eg: matcher.group(String name); 可使用该方法获取本命名捕获组, 形参name即为命名捕获组的名称。
(?:X)
X, 作为一个非捕获组, 与捕获组的区别在于不捕获匹配的文本,仅仅作为分组进行正则X匹配,在匹配完成后在内存中不保留匹配到的字符。
eg: matcher.group(int num); 将忽略本非捕获组的值。
(?idmsuxU-idmsuxU)
Nothing, 但是开启匹配标志i d m s u x U,可以使用'-'关闭匹配标志。
(?idmsux-idmsux:X)
X, 作为一个非捕获组, 可以指定开启匹配标志i d m s u x U,可以使用'-'关闭匹配标志。
(?=X)
X, 通过零宽度的正先行断言,也有叫前瞻匹配;标志从当前位置开始,将对之后字符匹配满足正则X进行断言。
(?!X)
X, 通过零宽度的负先行断言,与(?=X)相反;标志从当前位置开始,将对之后字符匹配不满足正则X进行断言。
(?<=X)
X, 与(?=X)查找方向相反,通过零宽度的正后行断言,也有叫后顾匹配;标志从当前位置开始,将对之前字符匹配满足正则X进行断言。
(?<!X)
X, 与(?!X)查找方向相反,通过零宽度的负后行断言,与(?<=X)相反;标志从当前位置开始,将对之前字符匹配不满足正则X进行断言。
(?>X)
X, 作为独立的非捕获组;标志从当前位置开始,将对之后字符匹配正则X,其消耗字符。
注意: 预匹配不消耗字符, 而(?>X)消耗字符。
Demo:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexCapturingDemo {
// 获取时间
private static void namedCapturing(String logStr) {
Pattern p = Pattern.compile("(?<time>\\d+:\\d+:\\d+).*");
Matcher m = p.matcher(logStr);
m.matches();
System.out.println(m.group("time") + " s\n");
}
// 获取毫秒值
private static void nonCapturing(String logStr) {
Pattern p = Pattern.compile("(?:\\d+:\\d+:\\d+).(\\d+).*");
Matcher m = p.matcher(logStr);
m.matches();
System.out.println(m.group(1) + " ms\n");
}
// 匹配error警告日志,获取错误类信息
private static void idmsuxUCapturing(String logStr) {
Pattern p = Pattern.compile("(?:\\d+:\\d+:\\d+).*(?i:error) (.*Controller).*");
Matcher m = p.matcher(logStr);
m.matches();
System.out.println(m.group(1) + " class\n");
}
// 将匹配c.a.w.c.包下的含Controller后缀的类名
private static void lookaheadCapturing(String logStr) {
Pattern p = Pattern.compile("(?:\\d+:\\d+:\\d+).*(?i:error) (?=c.a.w.c.).*\\.(?<controller>.*Controller).*");// 预匹配包,不满足则不再正则匹配
Matcher m = p.matcher(logStr);
m.matches();
System.out.println(m.group(1) + " class\n");
}
// 输出匹配到的TradeController的全类名
private static void lookbehindCapturing(String logStr) {
Pattern p = Pattern.compile("(?:\\d+:\\d+:\\d+).*(?i:error) (.*controller.*)(?<=TradeController) - .*");
Matcher m = p.matcher(logStr);
m.matches();
System.out.println(m.group(1) + "\n");
}
// 从左往右依次匹配
private static void independentCapturing(String logStr) {
Pattern p = Pattern.compile("(?>in|insert|inspect)(.*)");
Matcher m = p.matcher(logStr);
m.matches();
System.out.println(m.group(1) + "\n");
p = Pattern.compile("(?>insert|inspect|in)(.*)");
m = p.matcher(logStr);
m.matches();
System.out.println(m.group(1) + "\n");
}
public static void main(String[] args) {
String logStr = "04:12:45.432 [http-nio2-8080-exec-3] ERROR c.a.w.c.controller.TradeController - {"
+ "\"message\":\"Invalid request parameters or post body.\"}";
namedCapturing(logStr);
nonCapturing(logStr);
idmsuxUCapturing(logStr);
lookaheadCapturing(logStr);
lookbehindCapturing(logStr);
independentCapturing("inspector insert");
}
}
参考链接: java7 Pattern & regular-expressions & regexbuddy & 使用正则表达式找出不包含特定字符串的条目