木心

毕竟几人真得鹿,不知终日梦为鱼

导航

java正则表达式

1、下面是java中正则表达式常用的语法:

字符的取值范围
1.[abc] : 表示可能是a,可能是b,也可能是c。
2.[^abc]: 表示不是a,b,c中的任意一个
3.[a-zA-Z]: 表示是英文字母
4.[0-9]:表示是数字

简洁的字符表示
.:匹配任意的字符
\d:表示数字
\D:表示非数字
\s:表示由空字符组成,[ \t\n\r\x\f]
\S:表示由非空字符组成,[^\s]
\w:表示字母、数字、下划线,[a-zA-Z0-9_]
\W:表示不是由字母、数字、下划线组成

数量表达式
1.?: 表示出现0次或1次
2.+: 表示出现1次或多次
3.*: 表示出现0次、1次或多次
4.{n}:表示出现n次
5.{n,m}:表示出现n~m次
6.{n,}:表示出现n次或n次以上

逻辑表达式
1.XY: 表示X后面跟着Y,这里X和Y分别是正则表达式的一部分
2.X|Y:表示X或Y,比如"food|f"匹配的是foo(d或f),而"(food)|f"匹配的是food或f
3.(X):子表达式,将X看做是一个整体

2、是否匹配

@Test
public void test1() {
    String str = "1234567abc";
    // \w:表示字母、数字、下划线,[a-zA-Z0-9_]
    // {n,}:表示出现n次或n次以上
    String regex = "\\w{10,}";
    System.out.println(str.matches(regex));
}

@Test
public void test2() {
    String str = "1234567abc";
    String regex = "\\w{10,}";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(str);
    System.out.println(matcher.matches());
}

@Test
public void test3() {
    String content = "I am noob from runoob.com.";
    String pattern = ".*runoob.*";

    boolean isMatch = Pattern.matches(pattern, content);
    System.out.println("字符串中是否包含了 'runoob' 子字符串? " + isMatch);
}

 

3、统计次数

 下面是一个对单词 "cat" 出现在输入字符串中出现次数进行计数的例子:

@Test
public void test4() {
    String REGEX = "\\bcat\\b";
    String INPUT = "cat cat cat cattie cat";

    Pattern p = Pattern.compile(REGEX);
    Matcher m = p.matcher(INPUT); // 获取 matcher 对象
    int count = 0;

    while (m.find()) {
        count++;
        System.out.println("Match number " + count);
        System.out.println("start(): " + m.start());
        System.out.println("end(): " + m.end());
        System.out.println(m.group()); // 匹配的字符串
    }
}

 

4、过滤读取

从一串字符串中抓取指定格式的子字符串

/**
 * Transform StackTrace info to string
 * @param t
 * @return
 */
private static String printStackTraceToString(Throwable t) {
    if (t == null) {
        return "";
    }
    
    StringWriter sw = null;
    PrintWriter pw = null;
    try {
        sw = new StringWriter();
        pw =  new PrintWriter(sw);
        t.printStackTrace(pw);
        pw.flush();
        sw.flush();
        return sw.getBuffer().toString();
    } finally {
        if (sw != null) {
            try {
                sw.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
        if (pw != null) {
            pw.close();
        }
    }
}

/**
 * Get the specified information from StackTrace.
 * For example, the string of matching the regex["at amberai.jweb(\\S*)"] or 
 * ["at com.jsite(\\S*)"]. 
 * @param t
 * @return
 */
private static String getStackTraceInfo(Throwable t) {
    String stackTraceInfo = "";
    
    String stackTrace = printStackTraceToString(t);
    
    // 匹配的第一种情况
    String regex = "at amberai.jweb(\\S*)";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(stackTrace);
    while (matcher.find()) {
        stackTraceInfo += matcher.group() + "\n";
    }
    
    // 匹配的第二种情况
    regex = "at com.jsite(\\S*)";
    pattern = Pattern.compile(regex);
    matcher = pattern.matcher(stackTrace);
    while (matcher.find()) {
        stackTraceInfo += matcher.group() + "\n";
    }
    
    return stackTraceInfo;
}

 

@Test
public void demo() {
    String stackTraceInfo = "";
    String stackTrace = "at com.amberai.posmrg:ddagagag\nat com.amberai.mini:aaaamberai";
    
    String regex = "at(\\s*)(\\S*)amberai(\\S*)";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(stackTrace);
    while (matcher.find()) {
        stackTraceInfo += matcher.group() + "\n";
    }
    System.out.println(stackTraceInfo);
}

 

5、过滤替换

public static void main(String[] args) {
    String string = replaceBlank("- a\r\t\t\n   \n   \n  2  \r3\t4    -");
    System.out.println(string);
}

/*
 * 去除数据的空格、回车、换行符、制表符
 */
public static String replaceBlank(String str) {
    String dest = "";
    if (str != null) {
        Pattern p = Pattern.compile("\\s");
        Matcher m = p.matcher(str);
        dest = m.replaceAll("");
    }
    return dest;
}

 

参考:

  1)java中正则表达式基本用法

  2)菜鸟教程:https://www.runoob.com/java/java-regular-expressions.html

 

posted on 2019-09-18 17:51  wenbin_ouyang  阅读(244)  评论(0编辑  收藏  举报