Java Regex

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值