一、什么是正則表達式?
正則表達式是一種可以用于模式匹配和替換的規范。
一個正則表達式就是由普通的字符(例如字符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()
:重置匹配器。