Java 正则表达式

Java 正则表达式, 可以用 "简洁而强大" 来形容!

Java 正则表达式, 存在于 java.util.regex 包中, 是到 JDK 1.4 才引入的, 仅包含上面两个类, 和一个异常类.

  • Pattern (模式类) 正则表达式的编译形式, 用来表达和陈述所要搜索模式的对象.
  • Matcher (匹配器类) 通过解释正则模式, 在字符串上执行模式匹配的引擎, 是真正影响搜索的对象.

Pattern

生成 Pattern 对象

生成 Pattern 对象只有一种方法, 就是调用其静态方法 compile.

static Pattern compile(String regex)
static Pattern compile(String regex, int flags)

Matcher

生成 Matcher 对象

生成 Matcher 对象只有一种方法, 就是调用 Pattern 对象的成员方法 matcher.

Matcher matcher(CharSequence input)

Java 正则表达式

预定义字符集

  • \p{Lower}=[a-z]
  • \p{Upper}=[A-Z]
  • \p{ASCII}=[\x00-\x7F]
  • \p{Alpha}=[\{Lower}\p{Upper}]
  • \p{Digit}=[0-9]=\d
  • \p{Alnum}=[\p{Alpha}\p{Digit}]
  • \w=[\p{Alnum}_]
  • \p{Punct}=[!"#$%&'()*+,-./:;<=>?@[]^_`{|}~]
  • \p{Graph}=[\p{Alnum}\p{Punct}]
  • \p{Print}=[\p{Graph}\x20]
  • \p{Blank}=[\t\x20]
  • \p{Space}=[\t\n\v\f\r\x20]=\s
  • \p{Cntrl}=[\x00-\x1F\x7F]
  • \p{XDigit}=[0-9a-fA-F]
  • \p{javaLowerCase} 各种语言的小写字母, 远远比 \p{Lower}
  • \p{javaUpperCase} 各种语言的大写字母, 远远比 \p{Upper}
  • \p{javaWhitespace} 各种空白字符, 远远比 \p{Space} 多, 还包括中文的空白
  • \p{P} 各种语言的标点符号, 远远比 \p{Punct}
  • \p{Ps} 开始括号
  • \p{Pe} 结束括号
  • \p{Pi} 开始引号
  • \p{Pf} 结束引号
  • \p{Pc} 连接字符
  • \p{Pd} 虚线字符
  • \p{Po} 其他字符
  • \p{S} 符号
  • \p{Z} 分隔符

这里附上字符集检查代码

private void filterByPattern(Pattern p) {
    for (int i = 0; i < 65536; i++) {
        char c = (char) i;
        if (p.matcher(c + "").matches()) {
            System.out.println(String.format("%d\t%s", i, c));
        }
    }
}

常用工具方法

提取符合 Pattern 模式的字符串

用于提取符合模式的字符串, 或者说, 提取有用信息.

public static List<String> extract(Pattern p, String str) {
    List<String> rs = new ArrayList<String>();
    Matcher m = p.matcher(str);
    while (m.find()) {
        rs.add(m.group());
    }
    return rs;
}

判断字符串是否包含 Pattern 模式

用于字符串模式查找.

public static boolean hasMatch(Pattern p, String str) {
    return p.matcher(str).find();
}

判断字符串是否符合 Pattern 模式

用于字符串模式校验

public static boolean isMatch(Pattern p, String str) {
    return p.matcher(str).matches();
}

参考文献