Java Regex

来源:互联网 发布:肯尼迪遇刺真相知乎 编辑:程序博客网 时间:2024/04/28 09:07
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 & 使用正则表达式找出不包含特定字符串的条目

0 0
原创粉丝点击