1.1、概述
符合一規(guī)則的表達(dá)式:用于專(zhuān)門(mén)操作字符串。
正則表達(dá)式則必須依靠Pattern類(lèi)與Matcher類(lèi),這兩個(gè)類(lèi)都在java.util.regex包中定義。Pattern類(lèi)的主要作用是進(jìn)行正則規(guī)范的編寫(xiě),而Matcher類(lèi)主要是執(zhí)行規(guī)范,驗(yàn)證一個(gè)字符串是否符合其規(guī)范。


Pattern:
正則表達(dá)式的編譯表示形式。
指定為字符串的正則表達(dá)式必須首先被編譯為此類(lèi)的實(shí)例。然后,可將得到的模式用于創(chuàng)建 Matcher 對(duì)象,依照正則表達(dá)式,該對(duì)象可以與任意字符序列匹配。執(zhí)行匹配所涉及的所有狀態(tài)都駐留在匹配器中,所以多個(gè)匹配器可以共享同一模式。
因此,典型的調(diào)用順序是
Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches();

Matcher:
通過(guò)解釋 Pattern 對(duì) character sequence 執(zhí)行匹配操作的引擎。
通過(guò)調(diào)用模式的 matcher 方法從模式創(chuàng)建匹配器。創(chuàng)建匹配器后,可以使用它執(zhí)行三種不同的匹配操作:
matches 方法嘗試將整個(gè)輸入序列與該模式匹配。
lookingAt 嘗試將輸入序列從頭開(kāi)始與該模式匹配。
find 方法掃描輸入序列以查找與該模式匹配的下一個(gè)子序列。
每個(gè)方法都返回一個(gè)表示成功或失敗的布爾值。通過(guò)查詢(xún)匹配器的狀態(tài)可以獲取關(guān)于成功匹配的更多信息。
2.1、規(guī)則-預(yù)定義字符類(lèi)
常用正則規(guī)則
No. | 規(guī)范 | 描述 | No. | 規(guī)范 | 描述 |
1 | // | 表示反斜線(xiàn)(/)字符 | 2 | /t | 表示制表符 |
3 | /n | 表示換行 | 4 | [abc] | 字符a、b或c |
5 | [^abc] | 除了a、b、c之外的任意字符 | 6 | [a-zA-Z0-9] | 表示由字母、數(shù)字組成 |
7 | /d | 表示數(shù)字0-9 | 8 | /D | 表示非數(shù)字[^0-9] |
9 | /w | 表示字母、數(shù)字、下劃線(xiàn) | 10 | /W | 表示非字母、數(shù)字、下劃線(xiàn)[^/w] |
11 | /s | 表示所有空白字符(換行、空格等) | 12 | /S | 表示所有非空白字符[^/s] |
13 | ^ | 行的開(kāi)頭 | 14 | $ | 行的結(jié)尾 |
15 | . | 匹配除換行符之外的任意字符 |
|
|
|
2.2、匹配規(guī)則
No. | 規(guī)范 | 描述 | No. | 規(guī)范 | 描述 |
1 | X | 必須出現(xiàn)一次 | 2 | X? | 可以出現(xiàn)0次或1次 |
3 | X* | 可以出現(xiàn)0次、1次或多次 | 4 | X+ | 可以出現(xiàn)1次或多次 |
5 | X{n} | 必須出現(xiàn)n次 | 6 | X{n,} | 必須出現(xiàn)n次以上 |
7 | X{n,m} | 必須出現(xiàn)n~m次 |
|
|
|
No. | 規(guī)范 | 描述 | No. | 規(guī)范 | 描述 |
1 | XY | X規(guī)范后跟著Y規(guī)范 | 2 | X | Y | X規(guī)范或Y規(guī)范 |
3 | (X) | 做為一個(gè)捕獲組規(guī)范 |
|
|
|
No. | 方法 | 類(lèi)型 | 描述 |
1 | public static Pattern compile(String regex) | 普通 | 指定正則表達(dá)式規(guī)則 |
2 | public Matcher matcher(CharSequence input) | 普通 | 返回Matcher類(lèi)實(shí)例 |
3 | public String[] split(CharSequence input) | 普通 | 字符串拆分 |
| 方法摘要 | |
|---|---|
static Pattern | compile(String regex) 將給定的正則表達(dá)式編譯到模式中。 |
static Pattern | compile(String regex, int flags) 將給定的正則表達(dá)式編譯到具有給定標(biāo)志的模式中。 |
int | flags() 返回此模式的匹配標(biāo)志。 |
Matcher | matcher(CharSequence input) 創(chuàng)建匹配給定輸入與此模式的匹配器。 |
static boolean | matches(String regex, CharSequence input) 編譯給定正則表達(dá)式并嘗試將給定輸入與其匹配。 |
String | pattern() 返回在其中編譯過(guò)此模式的正則表達(dá)式。 |
static String | quote(String s) 返回指定 String 的字面值模式 String。 |
String[] | split(CharSequence input) 圍繞此模式的匹配拆分給定輸入序列。 |
String[] | split(CharSequence input, int limit) 圍繞此模式的匹配拆分給定輸入序列。 |
String | toString() 返回此模式的字符串表示形式。 |
2.5、邊界匹配器
| 邊界匹配器 | |
|---|---|
| ^ | 行的開(kāi)頭 |
| $ | 行的結(jié)尾 |
| /b | 單詞邊界 |
| /B | 非單詞邊界 |
| /A | 輸入的開(kāi)頭 |
| /G | 上一個(gè)匹配的結(jié)尾 |
| /Z | 輸入的結(jié)尾,僅用于最后的結(jié)束符(如果有的話(huà)) |
| /z | 輸入的結(jié)尾 |
3.1、常用方法
No. | 方法 | 類(lèi)型 | 描述 |
1 | public boolean matches(String regex) | 普通 | 字符串匹配 |
2 | public String replaceAll(String regex,String replacement) | 普通 | 字符串替換 |
3 | public String[] split(String regex) | 普通 | 字符串拆分 |
4.1、驗(yàn)證用戶(hù)輸入不是QQ號(hào)
/*驗(yàn)證用戶(hù)輸入不是QQ號(hào)QQ號(hào)以1-9開(kāi)頭,5-15位長(zhǎng)度都是數(shù)字使用/d或者[0-9]表示數(shù)字完成*/import java.util.*;import java.util.regex.*;class RegexDemo1{ public static void main(String[] args) { //聲明一個(gè)掃描器的變量,來(lái)接收用戶(hù)鍵盤(pán)輸入 Scanner input=new Scanner(System.in); //接收輸入數(shù)據(jù) String qq=input.nextLine(); //調(diào)用校驗(yàn) checkQQ(qq); } /* 校驗(yàn)QQ */ public static void checkQQ(String qq) { //定義正則 //String regex="^[1-9]//d{4,14}$"; String regex="[1-9][0-9]{4,14}"; //獲取Pattern對(duì)象 Pattern p=Pattern.compile(regex); //驗(yàn)證字符串內(nèi)容是否符合正則 Matcher m=p.matcher(qq); //判斷 if(m.matches()) { System.out.); } else { System.out.println(qq+"不是合法的QQ!"); } }}
4.2、驗(yàn)證手機(jī)號(hào)碼是不是正確
/*驗(yàn)證手機(jī)號(hào)碼是不是正確手機(jī)號(hào)1開(kāi)頭,都是數(shù)字,長(zhǎng)度11位*/import java.util.regex.*;import java.util.*;class RegexDemo2 { public static void main(String[] args) { Scanner input=new Scanner(System.in); String mobile=input.nextLine(); checkMobile(mobile); } public static void checkMobile(String mobile) { //String regex="1[0-9]{10}"; String regex="^[1][0-9]{10}$"; Pattern p=Pattern.compile(regex); Matcher m=p.matcher(mobile); if(m.find()) { System.out.println(mobile+"是合法的手機(jī)號(hào)碼!"); } else { System.out.println(mobile+"不是合法的手機(jī)號(hào)碼!"); } }}
4.3、驗(yàn)證用戶(hù)輸入郵箱是否合法
/*驗(yàn)證用戶(hù)輸入郵箱是否合法*/import java.util.regex.*;import java.util.*;class RegexMail { public static void main(String[] args) { Scanner input =new Scanner(System.in); String email=input.nextLine(); checkMail(email); } public static void checkMail(String email) { //郵件正則 String regex="http://w+@//w+(//.//w+)+"; //直接使用String類(lèi)的方法來(lái)比較 boolean flag=email.matches(regex); //輸出結(jié)果 System.out.println(email+"..."+flag); }}
4.4、字符串匹配
/*字符串匹配*/import java.util.regex.*;class RegextDemo3 { public static void main(String[] args) { String str="aoob"; String reg="ao?b"; boolean b=str.matches(reg);//false ?表示不出現(xiàn)或者最多只能出現(xiàn)一次 System.out.println(str+"......"+b); reg="ao+b";//o最少出現(xiàn)一次,可出現(xiàn)多次 b=str.matches(reg); System.out.println(str+"......"+b);//true str="ab"; reg="ao+b";//o必須最少出現(xiàn)一次, b=str.matches(reg); System.out.println(str+"......"+b);//false str="ab"; reg="ao*b";//可以不出現(xiàn)也可以出現(xiàn)多次 b=str.matches(reg); System.out.println(str+"......"+b);//true str="aooooooob"; reg="ao{4,}b";//o最少出現(xiàn)4次,可以更多次 b=str.matches(reg); System.out.println(str+"......"+b);//true reg="ao{4,6}b}";//o現(xiàn)象4-6次 b=str.matches(reg);//o出現(xiàn)了7次 System.out.println(str+"......"+b);//false }}
4.5、字符串切割
/*切割*/import java.util.regex.*;class RegexDemo2 { public static void main(String[] args) { split_Fun(); System.out.println("================"); split_Fun2(); System.out.println("================"); split_Fun3(); System.out.println("================"); split_Fun4(); System.out.println("================"); split_Fun5(); } /* 按空格切割 */ public static void split_Fun() { String str="zhangsan lisi wangwu zhaoliu"; String reg="http://s+";///s表示空白字符也可以" +"表示 String [] arr=str.split(reg); //長(zhǎng)度 System.out.println("長(zhǎng)度"+arr.length); for(String s:arr) { System.out.println(s); } } /* 按一個(gè)元素多次重復(fù)出現(xiàn)切割 */ public static void split_Fun2() { String str="zhangsan.lisi..wangwu...zhaoliu"; String reg="http://.+"; String [] arr=str.split(reg); //長(zhǎng)度 System.out.println("長(zhǎng)度"+arr.length); for(String s:arr) { System.out.println(s); } } /* 雙反斜杠//// */ public static void split_Fun3() { String str="c://abc//a.txt"; String reg="http:////+"; String [] arr=str.split(reg); //長(zhǎng)度 System.out.println("長(zhǎng)度"+arr.length); for(String s:arr) { System.out.println(s); } } /* 按照疊詞來(lái)切割 為了可以讓規(guī)則被重用可以將規(guī)則封裝為一個(gè)組 用()完成,組的出現(xiàn)都有編號(hào) 從1開(kāi)始,想要使用已經(jīng)有的組可以通過(guò)/n的形式來(lái)獲取 n就是組的編號(hào) */ public static void split_Fun4() { String str="erkktyqquioppdffyphhct"; //按照疊詞來(lái)切割 String reg="(.)//1"; //(.)表示組,/1捕獲組, String [] arr=str.split(reg); //長(zhǎng)度 System.out.println("長(zhǎng)度"+arr.length); for(String s:arr) { System.out.println(s); } } /* 按重復(fù)元素切割 */ public static void split_Fun5() { String str="helloaaworkldbbbuiopccc"; //按照疊詞來(lái)切割 String reg="(.)//1+"; //(.)表示組,/1捕獲組, String [] arr=str.split(reg); //長(zhǎng)度 System.out.println("長(zhǎng)度"+arr.length); for(String s:arr) { System.out.println(s); } } }
4.6、替換
/*正則替換*/import java.util.regex.*;class ReplaceAllDemo { public static void main(String[] args) { //字符串中的數(shù)字替換為#號(hào) String str="wer123ty343232uio23232f889..ffdsaf4324qq"; String reg="http://d{4,}"; //4個(gè)以上的數(shù)字替換 replaceAll_Fun(str,reg,"#"); System.out.println("================="); String str1="erkktyqqquizzzzzzofffpeeenmcvvhss"; //將疊替換為$號(hào) String reg1="(.)//1+"; replaceAll_Fun(str1,reg1,"http://$"); System.out.println("================="); String str2="erkktyqqquizzzzzzofffpeeenmcvvhss"; //將疊替換為單個(gè)字符 String reg2="(.)//1+"; replaceAll_Fun(str2,reg2,"$1"); //使用$獲取組的內(nèi)容 } public static void replaceAll_Fun(String str,String reg,String newStr) { //替換 str=str.replaceAll(reg,newStr); System.out.println(str); }}
4.7、獲取
/*獲取:使用正則表達(dá)式將字符串符合規(guī)則的子串取郵1.將正則表達(dá)式封裝成對(duì)象2.讓正則對(duì)象和要操作的字符串相關(guān)聯(lián)3.關(guān)聯(lián)扣, 獲取正則匹配引擎4.通過(guò)引擎對(duì)象符合規(guī)則的子串操作,比如取出*/import java.util.regex.*;class RegexDemo4 { public static void main(String[] args) { getDemo1(); System.out.println("==============="); } public static void getDemo1() { String str="ming tian jiu yao fang jia le , da jia. AWT HELLO"; String reg="http://b[A-Za-z]{3}//b"; //按3個(gè)字母組成的單詞獲取/b表示單詞邊界 //將規(guī)則封裝為對(duì)象 Pattern p=Pattern.compile(reg); Matcher m=p.matcher(str); //嘗試查找與該模式匹配的輸入序列的下一個(gè)子序列 while(m.find()) { //獲取獲取的組 System.out.println(m.group());//jiu yao jia jia System.out.println(m.start()+"...."+m.end()); } }}
4.8、示例
/*將下列字符串轉(zhuǎn)成:學(xué)要學(xué)編程"我我...我我...我要...要要...學(xué)學(xué)學(xué)...學(xué)學(xué)...編編編...編程..程.程程...程...程";1.如果只想知道該字符是否符合規(guī)則--使用匹配2.想要將已經(jīng)有的字符串變成另一個(gè)字符串,替換3.想要按照自定義方式,將字符串變成多個(gè)字符串,---切割-獲取規(guī)則以外的字符串4.想要拿到符合要求的字符串子串,----獲取---獲取符合規(guī)則的子串*/import java.util.*;class RegexText { public static void main(String[] args) { String str="我我...我我...我要...要要...學(xué)學(xué)學(xué)...學(xué)學(xué)...編編編...編程..程.程程...程...程"; /* 替換 先將..去掉 再將重復(fù)的內(nèi)容變成單個(gè)內(nèi)容 */ str=str.replaceAll("http://.+","");//將.替換為""空字符串 System.out.println(str); str=str.replaceAll("(.)//1+","$1");//使用組,替換 System.out.println(str); }}
4.9、替換,切割
/*192.168.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30還按照字符串自然順序,只要讓它們每一段都 是3位即可。1.按照每一段需要的最多的0進(jìn)行補(bǔ)齊,那么每一段就會(huì)至少保證3位2.將每一段只保留3位。這位的所有的ip地址都每一段3位*/import java.util.*;import java.util.regex.*;class RegexText2{ public static void main(String[] args) { String ip="192.168.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30"; //為每一段數(shù)字前加2個(gè)0 ip=ip.replaceAll("(//d+)","00$1"); System.out.println(ip); /*00192.00168.001.00254 00102.0049.0023.00013 0010.0010.0010.0010 002.002.002.002 008.00109.0090.0030 */ //再次替換 ip=ip.replaceAll("0*(//d{3})","$1"); System.out.println(ip); //192.168.001.254 102.049.023.013 010.010.010.010 002.002.002.002 008.109.090.030 //切割 String [] arr=ip.split(" +"); /* Arrays.sort(arr); System.out.println(Arrays.toString(arr)); */ //或者使用TreeSet TreeSet<String> ts=new TreeSet<String>(); for(String s:arr) { ts.add(s); } //遍歷Set集合 for(String s:ts) { //將前置0刪除 System.out.println(s.replaceAll("0*(//d+)","$1")); } /* 2.2.2.2 8.109.90.30 10.10.10.10 102.49.23.13 192.168.1.254 */ }}
5.1、示例
/*爬蟲(chóng)1從頁(yè)面爬郵箱*/import java.io.*;import java.util.regex.*;import java.util.*;import java.net.*;class RegexTest1{ public static void main(String[] args) throws Exception { List<String> list=getMail(); for(String s:list) { System.out.println(s); } } public static List<String> getMail() throws Exception { //從指定網(wǎng)址http://www.hao123.com/ String uaddr="http://www.hao123.com/"; //轉(zhuǎn)換為URL對(duì)象 URL url=new URL(uaddr); //獲取URLConnection對(duì)象,并連接,再獲取流 //openStream(),就是openConnection().getInputStream()是個(gè)字節(jié)流 //封裝為字符緩沖流 BufferedReader br=new BufferedReader(new InputStreamReader(url.openStream())); //郵箱正則 String reg="http://w+@//w+(//.//w+)+"; //獲取封裝對(duì)象 Pattern p=Pattern.compile(reg); List<String> list = new ArrayList<String>(); //開(kāi)始讀取流 String line=null; while ((line=br.readLine())!=null) { //獲取正則校驗(yàn)對(duì)象 Matcher m=p.matcher(line); //獲取 while (m.find()) { //獲取組,并添加 list.add(m.group()); } } br.close(); //返回結(jié)果集 return list; }}
示例
/*網(wǎng)頁(yè)爬蟲(chóng)(蜘蛛)*/import java.io.*;import java.util.regex.*;class RegexTest3{ public static void main(String[] args) throws Exception { getMail(); } public static void getMail() throws Exception { BufferedReader br=new BufferedReader(new FileReader("d://mail.txt")); String mailReg="http://w+@//w+(//.//w+)+"; Pattern p=Pattern.compile(mailReg); String line=null; while ((line=br.readLine())!=null) { Matcher m=p.matcher(line); while (m.find()) { System.out.println(m.group()); } } }}/*fdsfadsafdsfdsfsdf> abc@sina.com<fdslfdsfdsf;dsjfsdjffdsfadsafdsfdsfsdf> fdsfads@sina.com<fdslfdsfdsf;dsjfsdjffdsfadsafdsfdsfsdf> fdsaf@qq.com<fdslfdsfdsf;dsjfsdjfafdsaffadsfadfssafdsdfdsfsdf> abc@sina.com<fdslfdsfdsf;dsjfsdjfffdsfadsafdsffdsfsdf> abc@163.com<fdslfdsfdsf;dsjfsdjfsafdsfadsafdssffdsfsdf> abc@sina.com<fdslfdsfdsf;dsjfsdjfdsfdsfadsafdsfdsfsdf> fdsafdsc@sina.com<fdslfdsfdsf;dsjfsdjffafdfdsfadsafdsfdsfsdf> weweq@sina.com<fdslfdsfdsf;dsjfsdjffdsa>abc@sina.com<fdslfdsfdsf;dsjfsdjffdsfadsafdsfdsfsdf> adsdsafdsc@sina.com<fdslfdsfdsf;dsjfsdjfsafdsfadsafdsfdsfsdf> abc@sina.com<fdslfdsfdsf;dsjfsdjfdsafdfdsfadsafdsfdsfsdf> abc@sina.com;fdslfdsfdsf;dsjfsdjfffdsfdsfadsafdsfdsfsdf> abc@sina.com <fdslfdsfdsf;dsjfsdjfdsdsasaffdsfadsafdsfdsfsdf> abc@sina.com <fdslfdsfdsf;dsjfsdjf*/
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注