一、什么是正則表達(dá)式订晌?
正則表達(dá)式是一種可以用于模式匹配和替換的規(guī)范虏辫。
一個(gè)正則表達(dá)式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)組成的文字模式。
它用以描述在查找文字主體時(shí)待匹配的一個(gè)或多個(gè)字符串锈拨。
正則表達(dá)式作為一個(gè)模板砌庄,將某個(gè)字符模式與所搜索的字符串進(jìn)行匹配。
二奕枢、用途
- 字符串匹配(字符匹配)
- 字符串查找
- 字符串替換
- 字符串分割
三娄昆、Java中處理正則表達(dá)式的類(lèi)
1、java.util.regex.Pattern:模式類(lèi)
字符串要被匹配的一個(gè)模式验辞。也是正則表達(dá)式的編譯表示形式稿黄。該模式本身已經(jīng)被編譯過(guò),使用的話(huà)效率要高很多跌造。
指定為字符串的正則表達(dá)式必須首先被編譯為此類(lèi)的實(shí)例杆怕。然后,可將得到的模式用于創(chuàng)建 Matcher對(duì)象壳贪,依照正則表達(dá)式陵珍,該對(duì)象可以與任意字符序列匹配。執(zhí)行匹配所涉及的所有狀態(tài)都駐留在匹配器中违施,所以多個(gè)匹配器可以共享同一模式互纯。
典型的調(diào)用順序:
Pattern p = Pattern.compile("a*b"); // 將給定的正則表達(dá)式編譯到模式中。
Matcher m = p.matcher("aaaaab"); // 創(chuàng)建匹配給定輸入與此模式的匹配器(Matcher對(duì)象)磕蒲。
boolean b = m.matches(); // 嘗試將整個(gè)區(qū)域與模式匹配留潦。當(dāng)且僅當(dāng)整個(gè)區(qū)域序列匹配此匹配器的模式時(shí)才返回 true只盹。
// 在僅使用一次時(shí),可以更方便地使用matches(String regex, CharSequence input)進(jìn)行匹配
// 對(duì)于重復(fù)的匹配而言它效率不高兔院,因?yàn)樗辉试S重用已編譯的模式殖卑。
boolean b = Pattern.matches("a*b", "aaaaab");
2、java.util.regex.Matcher:匹配類(lèi)
模式匹配某個(gè)字符串所產(chǎn)生的結(jié)果坊萝,這個(gè)結(jié)果可能會(huì)有很多個(gè)孵稽。
它是解釋 Pattern對(duì) character sequence執(zhí)行匹配操作的引擎。
通過(guò)調(diào)用模式的 matcher方法從模式創(chuàng)建匹配器十偶。
(1)匹配方法:matches()菩鲜、find()、lookingAt()
創(chuàng)建匹配器后惦积,可以使用它執(zhí)行三種不同的匹配操作:
matches()
:方法嘗試將整個(gè)輸入序列與該模式匹配接校。當(dāng)且僅當(dāng)整個(gè)區(qū)域序列匹配此匹配器的模式時(shí)才返回 true。lookingAt()
:嘗試將輸入序列從頭開(kāi)始與該模式匹配荣刑。與matches
不同的是馅笙,它不需要匹配整個(gè)區(qū)域伦乔。當(dāng)且僅當(dāng)輸入序列的前綴匹配此匹配器的模式時(shí)才返回 true厉亏。find()
:方法掃描輸入序列以查找與該模式匹配的下一個(gè)子序列。當(dāng)且僅當(dāng)輸入序列的子序列匹配此匹配器的模式時(shí)才返回 true烈和。find(int start)
:重置此匹配器爱只,然后嘗試查找匹配該模式、從指定索引開(kāi)始的輸入序列的下一個(gè)子序列招刹。當(dāng)且僅當(dāng)從給定索引開(kāi)始的輸入序列的子序列匹配此匹配器的模式時(shí)才返回 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");
// 將整個(gè)"123-34345-234-00"用正則表達(dá)式引擎查找匹配,當(dāng)?shù)降谝粋€(gè)"-"不匹配了疯暑,就停止训柴。但不會(huì)將不匹配的"-"吐出來(lái)
System.out.println(m.matches());
// 將不匹配的"-"吐出來(lái)
m.reset();
/**
* 當(dāng)前面是m.matches()時(shí),查找子字符串從"34345-234-00"開(kāi)始
* 當(dāng)前面是m.matches()和m.reset()時(shí)妇拯,查找子字符串從"123-34345-234-00"開(kāi)始
*/
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
:開(kāi)始搜索幻馁,匹配到就替換。appendTail
:在調(diào)用 appendReplacement方法后調(diào)用它來(lái)復(fù)制剩余的輸入序列越锈。replaceAll
:替換模式與給定替換字符串相匹配的輸入序列的每個(gè)子序列仗嗦。
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:?jiǎn)⒂貌粎^(qū)分大小寫(xiě)的匹配。
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");
}
}
// 不加這句話(huà)甘凭,字符串sdofg將會(huì)被遺棄
m.appendTail(buf);
System.out.println(buf);
}
}
(3)分組
group()
:返回由以前匹配操作所匹配的輸入子序列稀拐。group(int group)
:返回在以前匹配操作期間由給定組捕獲的輸入子序列。groupCount()
:返回此匹配器模式中的捕獲組數(shù)丹弱。
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()); // 數(shù)字德撬、字母都有
System.out.println(m.group(1)); // 只有數(shù)字
System.out.println(m.group(2));// 只有字母
}
}
}
(4)重置匹配器
-
reset()
:重置匹配器铲咨。