一、简介
正则表达式(regular expression,简写为regex)是一个字符串,用来描述匹配一个字符串集合的模式。 可以使用正则表达式来匹配、替换和拆分字符串。
Java的正则表达式主要由java.util.regex包的以下三个类实现的:
Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
二、匹配字符串
从String类中的matches方法,初看,与equals方法类似,如以下语句的结果都为true:
"Java".matches("Java");
"Java".equals("Java");
然而,matches方法功能更加强大,它不仅可以匹配一个固定的字符串,还可以匹配符合一个模式的字符串集,如以下语句的结果都为true:
"Java is fun".matches("Java.*")
"Java is cool".matches("Java.*")
"Java is powerful".matches("Java.*")
前面语句中的 "Java.*"是一个正则表达式,它描述了一个字符串模式,以Java开始,后面跟0个或者多个字符串。这里,子字符串 .* 匹配0或者多个任意字符。
三、正则表达式语法
正则表达式由字面值字符和特殊符号组成,下面的表格列出了正则表达式常用的语法
构建正则表达式
下面是一些示例:
1.社会安全号的模式是 xxx-xx-xxxx,其中x是一位数字,根据题意得知我们规定的模式就是这样,那么它的正则表达式可以描述为 [\\d]{3}-[\\d]{2}-[\\d]{4}
"111-22-3333".matches("[\\d]{3}-[\\d]{2}-[\\d]{4}")
return true
"11-22-3333".matches("[\\d]{3}-[\\d]{2}-[\\d]{4}")
return false
2.偶数以数字 0、 2、 4、 6 或者 8 结尾,那么偶数的模式可以描述为 [\\d]*[02468]
"122".matches("[\\d]*[02468]") return true.
"123".matches("[\\d]*[02468]") return false.
3.电话号码的模式是 (xxx)xxx-xxxx,这里x是一位数字,并且第一位数字不能为0,那么电话号码的正则表达式可以描述为 \\([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{4}
"(912) 921-2343".matches("\\([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{4}") return true.
"(012) 921-2343".matches("\\([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{4}") return false.
四、替换和拆分字符串
如果字符串匹配正则表达式,String类的matches方法返回true,当然了String类也包含repalceAll、replaceFirst和split方法,用于替换和拆分字符串,用法如下图所示:
replaceAll 方法表示替换所有匹配的子字符串 replaceFirst方法表示替换第一个匹配的子字符串,例如:
System.out.println("Java Java Java".replaceAll("v\\w", "wi"));
//显示 Jawi Jawi Jawi
System.out.println("Java Java Java".replaceFirst("v\\w", "wi"));
//显示 Jawi Java Java
split方法有两个重载方式:
1.split(regex)方法使用匹配的分隔符将一个字符串拆分为子字符串
2.split(regex,limit)方法中,limit 参数确定模式匹配多少次,如果 limit <= 0,split(regex,limit) 等同于 split(regex),如果 limit > 0,模式最多匹配 limit - 1次
注意:默认情况下,所有量词符都是“贪婪”的,这意味着它们会尽可能匹配多次,比如下面语句会显示 JRvaa,因为第一个匹配成功的是aaa :
System.out.println("Jaaavaa".replaceFirst("a+","R"));