一、什么是正则表达式?
正则表达式是一种可以用于模式匹配和替换的规范。
一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式。
它用以描述在查找文字主体时待匹配的一个或多个字符串。
正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
二、用途
- 字符串匹配(字符匹配)
- 字符串查找
- 字符串替换
- 字符串分割
三、Java中处理正则表达式的类
1、java.util.regex.Pattern:模式类
字符串要被匹配的一个模式。也是正则表达式的编译表示形式。该模式本身已经被编译过,使用的话效率要高很多。
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
典型的调用顺序:
Pattern p = Pattern.compile("a*b"); // 将给定的正则表达式编译到模式中。
Matcher m = p.matcher("aaaaab"); // 创建匹配给定输入与此模式的匹配器(Matcher对象)。
boolean b = m.matches(); // 尝试将整个区域与模式匹配。当且仅当整个区域序列匹配此匹配器的模式时才返回 true。
// 在仅使用一次时,可以更方便地使用matches(String regex, CharSequence input)进行匹配
// 对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。
boolean b = Pattern.matches("a*b", "aaaaab");
2、java.util.regex.Matcher:匹配类
模式匹配某个字符串所产生的结果,这个结果可能会有很多个。
它是解释 Pattern对 character sequence执行匹配操作的引擎。
通过调用模式的 matcher方法从模式创建匹配器。
(1)匹配方法:matches()、find()、lookingAt()
创建匹配器后,可以使用它执行三种不同的匹配操作:
matches()
:方法尝试将整个输入序列与该模式匹配。当且仅当整个区域序列匹配此匹配器的模式时才返回 true。lookingAt()
:尝试将输入序列从头开始与该模式匹配。与matches
不同的是,它不需要匹配整个区域。当且仅当输入序列的前缀匹配此匹配器的模式时才返回 true。find()
:方法扫描输入序列以查找与该模式匹配的下一个子序列。当且仅当输入序列的子序列匹配此匹配器的模式时才返回 true。find(int start)
:重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。当且仅当从给定索引开始的输入序列的子序列匹配此匹配器的模式时才返回 true。
package demo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestRegex {
public static void main(String[] args) {
/**
* matches()
*/
System.out.println("asdsfdfagf@adsdsfd.com".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+"));// true
Pattern p = Pattern.compile("\\d{3,5}");
Matcher m = p.matcher("123-34345-234-00");
// 将整个"123-34345-234-00"用正则表达式引擎查找匹配,当到第一个"-"不匹配了,就停止。但不会将不匹配的"-"吐出来
System.out.println(m.matches());
// 将不匹配的"-"吐出来
m.reset();
/**
* 当前面是m.matches()时,查找子字符串从"34345-234-00"开始
* 当前面是m.matches()和m.reset()时,查找子字符串从"123-34345-234-00"开始
*/
System.out.println(m.find());
System.out.println(m.start() + "---" + m.end());
System.out.println(m.find());
System.out.println(m.start() + "---" + m.end());
System.out.println(m.find());
System.out.println(m.start() + "---" + m.end());
System.out.println(m.find());
// System.out.println(m.start()+"---"+m.end());
System.out.println(m.lookingAt());
System.out.println(m.lookingAt());
System.out.println(m.lookingAt());
System.out.println(m.lookingAt());
}
}
(2)字符串替换方法:
appendReplacement
:开始搜索,匹配到就替换。appendTail
:在调用 appendReplacement方法后调用它来复制剩余的输入序列。replaceAll
:替换模式与给定替换字符串相匹配的输入序列的每个子序列。
package demo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 字符串替换
*
* @author xiangdonglee
*
*/
public class TestRegex2 {
public static void main(String[] args) {
// Pattern.CASE_INSENSITIVE:启用不区分大小写的匹配。
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("java Java jAva ILoveJavA youHateJAVA sdofg");
StringBuffer buf = new StringBuffer();
int i = 0;
while (m.find()) {
i++;
if (i % 2 == 0) {
m.appendReplacement(buf, "java");
} else {
m.appendReplacement(buf, "JAVA");
}
}
// 不加这句话,字符串sdofg将会被遗弃
m.appendTail(buf);
System.out.println(buf);
}
}
(3)分组
group()
:返回由以前匹配操作所匹配的输入子序列。group(int group)
:返回在以前匹配操作期间由给定组捕获的输入子序列。groupCount()
:返回此匹配器模式中的捕获组数。
package demo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 分组
*
* @author xiangdonglee
*
*/
public class TestRegex3 {
public static void main(String[] args) {
Pattern p = Pattern.compile("(\\d{3,5})([a-z]{2})");
String s = "123aa-34345bb-234cc-00";
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(m.group()); // 数字、字母都有
System.out.println(m.group(1)); // 只有数字
System.out.println(m.group(2));// 只有字母
}
}
}
(4)重置匹配器
-
reset()
:重置匹配器。