Java正则表达式

正则表达式是一套标准,可用于任何语言

JDK内置正则表达式引擎:Java.uilt.regex

方法

String类里也提供了如下几个特殊的方法。

  • boolean matches(String regex):判断该字符串是否匹配指定的正则表达式。
  • String replaceAll(String regex, String replacement):将该字符串中所有匹配regex的子串替换成replacement
  • String replaceFirst(String regex, String replacement):将该字符串中第一个匹配regex的子串替换成replacement
  • String[] split(String regex):以regex作为分隔符,把该字符串分割成多个子串。

上面这些特殊的方法都依赖于Java提供的正则表达式支持,除此之外,Java还提供了Pattern和Matcher两个类专门用于提供正则表达式支持。

精确匹配

需匹配 正则表达式 Java中正则
a&c a\&c a\&c
a和c a\u548cc a\u548cc
  • 正则中特殊符号最好转义一下,而Java中\也需转义
  • 非ASCII字符用了\u####表示,也要转义,不过这里Markdown没有显示岀来

符号

合法字符

合法字符

特殊字符

特殊字符
特殊字符在正则表达式中有其特殊的用途,如果需要匹配这些特殊字符,就必须首先将这些字符转义,也就是在前面添加一个反斜线(\)

将上面多个字符拼起来,就可以创建一个正则表达式。

预定义字符

预定义字符
“通配符”是可以匹配多个字符的特殊字符。正则表达式中的“通配符”远远超出了普通通配符的功能,它被称为预定义字符

1
2
String input = “1990”;
boolean is19xx = input.matches(“19\\d\\d”);

范围匹配

方括号表达式

  • 注意只能匹配[]其中一个字符
  • \^写在[]取非;写在开始从行的开头开始匹配

正则表示还支持圆括号表达式,用于将多个表达式组成一个子表达式,圆括号中可以使用或运算符(|)。例如,正则表达式”(public|protected|private)”用于匹配Java的三个访问控制符其中之一。
\\w{3,20}@\\w+\\.(com|org|cn|net|gov)

圆括号还可用于提取所需字符串,去掉多余内容

边界匹配符

数量标识符

正则表达式支持的数量标识符有如下几种模式

  • Greedy(贪婪模式):数量表示符默认采用贪婪模式,除非另有表示。贪婪模式的表达式会一直匹配下去,直到无法匹配为止。如果你发现表达式匹配的结果与预期的不符,很有可能是因为——你以为表达式只会匹配前面几个字符,而实际上它是贪婪模式,所以会一直匹配下去。
  • Reluctant(勉强模式):用问号后缀(?)表示,它只会匹配最少的字符。也称为最小匹配模式。
  • Possessive(占有模式):用加号后缀(+)表示,目前只有Java支持占有模式,通常比较少

使用Pattern和Matcher类

Pattern对象是正则表达式编译后在内存中的表示形式,因此,正则表达式字符串必须先被编译为Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象。执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可共享同一个Pattern对象Pattern是不可变类,可供多个并发线程安全使用。
只编译一次然后多次使用可以提高匹配效率

1
2
3
//将一个字符串编译成Pattern对象
Pattern p=Pattern.compile("a*b");//使用Pattern对象创建Matcher对象
Matcher m=p.matcher("aaaaab");boolean b=m.matches(); //返回true

如果某个正则表达式仅需一次使用,则可直接使用Pattern类的静态matches方法,此方法自动把指定字符串编译成匿名的Pattern对象

boolean b=Pattern.matches("a*b", "aaaaab"); //返回true

但采用这种语句每次都需要重新编译新的Pattern对象,不能重复利用已编译的Pattern对象,所以效率不高。

Matcher类提供了如下几个常用方法。
find():返回目标字符串中是否包含与Pattern匹配的子串。

  • find()方法还可以传入一个int类型的参数,带int参数的find()方法从该int索引处向下搜索。
    group():返回上一次与Pattern匹配的子串。

    start():返回上一次与Pattern匹配的子串在目标字符串中的开始位置。
    end():返回上一次与Pattern匹配的子串在目标字符串中的结束位置加1。
    lookingAt():返回目标字符串前面部分与Pattern是否匹配。
    matches():返回整个目标字符串与Pattern是否匹配。
    reset(),将现有的Matcher对象应用于一个新的字符序列。
    replaceAll()把字符串中所有与正则表达式匹配的子串替换replaceFirst(),该方法只替换第一个匹配的子串

在Pattern、Matcher类的介绍中经常会看到一个CharSequence接口,该接口代表一个字符序列,其中CharBuffer、String、StringBuffer、StringBuilder都是它的实现类。