正则表达式是一套标准,可用于任何语言
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 | String input = “1990”; |
范围匹配
方括号表达式
- 注意只能匹配[]其中一个字符
- \^写在[]取非;写在开始从行的开头开始匹配
正则表示还支持圆括号表达式,用于将多个表达式组成一个子表达式,圆括号中可以使用或运算符(|)。例如,正则表达式”(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 | //将一个字符串编译成Pattern对象 |
如果某个正则表达式仅需一次使用,则可直接使用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都是它的实现类。