JAVA第五课:正则表达式
目錄
- 序言
- 一、正則標(biāo)記
- 二、正則表達(dá)式基礎(chǔ)知識(shí)
- 1、主要包括以下三個(gè)類
- 2、弄清楚( )、[ ]、{ }的作用
- 三、應(yīng)用實(shí)例
- 1、匹配
- 2、切割
- 3、替換
- 4、獲取
- 5、示例
- 四、總結(jié)
序言
??這周按照老師要求,我自學(xué)了關(guān)于java正則表達(dá)式的內(nèi)容,發(fā)現(xiàn)正則表達(dá)式在編程中的作用很大,可以用來(lái)搜索、編輯或處理文本。現(xiàn)將學(xué)到的正則表達(dá)式的知識(shí)整理成文。
??在編寫(xiě)處理字符串的程序或網(wǎng)頁(yè)時(shí),經(jīng)常有查找符合某些復(fù)雜規(guī)則的字符串的需要。正則表達(dá)式就是用于描述這些規(guī)則的工具。換句話說(shuō),正則表達(dá)式就是記錄文本規(guī)則的代碼。
??Java中Spring.class涉及到正則表達(dá)式。如Spring.split(), matches(),replaceAll()等方法。
??Java中更一般使用正則表達(dá)式的方式是利用Pattern.class和Matcher.class,所在package為java.util.regex
一、正則標(biāo)記
1、字符
| B | 指定字符B |
| \xhh | 十六進(jìn)制值為oxhh的字符 |
| \uhhhh | 十六進(jìn)制值為oxhhhh的Unicode字符 |
| \t | tab |
| \n | 換行 |
| \r | 回車 |
| \e | 轉(zhuǎn)義 |
2、字符類
| . | 任意字符 |
| [abc] | [ ] 中括號(hào),包含a,b,c中任意字符 |
| [^abc] | [ ]中括號(hào)加^, 表示否定,除a,b,c之外的 |
| [a-z] | 從a到z的任意字符 |
| [a-z&&[hi]] | &&表示交集,即包含h或i |
| \s | 空白字符,包含空格,換行,回車,tab,換頁(yè) |
| \S | 大寫(xiě)為小寫(xiě)的取反,非空白字符,等價(jià)于[^\s] |
| \d | 數(shù)字0-9 |
| \D | 非數(shù)字,等價(jià)于[^0-9] |
| \w | 詞字符,數(shù)字,大小寫(xiě)字母,等價(jià)于[0-9a-zA-Z] |
| \W | 非詞,等價(jià)于[^\w] |
3、邏輯操作符
| XY | Y跟在X后面,并且XY同時(shí)滿足 |
| X | Y |
| (X) | () 小括號(hào)表示捕獲組(group),可以對(duì)group進(jìn)行處理,尤其是獲取其中的內(nèi)容 |
4、邊界匹配符
| ^ | 匹配邊界開(kāi)始 |
| $ | 匹配邊界結(jié)束 |
| \b | 詞的邊界 |
5、量詞
量詞描述了一個(gè)模式匹配文本的方式,包含
- 貪婪型:量詞默認(rèn)是貪婪的,發(fā)現(xiàn)盡可能多的匹配
- 勉強(qiáng)型:通過(guò)問(wèn)號(hào)(?)指定,匹配最小的字符數(shù),也稱為懶惰型,最少匹配,非貪婪。
- 占有型:通過(guò)加號(hào)(+)指定,當(dāng)用于字符串時(shí)防止匹配失敗時(shí)回溯。
| X? | X?? | X?+ | 匹配0個(gè)或1個(gè)X |
| X* | X*? | X*+ | 匹配0個(gè)或多個(gè)X |
| X+ | X+? | X++ | 匹配1個(gè)或多個(gè)X |
| X{n} | X{n}? | X{n}+ | 恰好匹配n個(gè)X |
| X{n,} | X{n,}? | X{n,}+ | 至少匹配n個(gè)X |
| X{n,m} | X{n,m}? | X{n,m}+ | 至少匹配n個(gè)X,最多匹配m個(gè)X |
二、正則表達(dá)式基礎(chǔ)知識(shí)
1、主要包括以下三個(gè)類
- Pattern 類:
pattern 對(duì)象是一個(gè)正則表達(dá)式的編譯表示。Pattern 類沒(méi)有公共構(gòu)造方法。要?jiǎng)?chuàng)建一個(gè) Pattern 對(duì)象,你必須首先調(diào)用其公共靜態(tài)編譯方法,它返回一個(gè) Pattern 對(duì)象。該方法接受一個(gè)正則表達(dá)式作為它的第一個(gè)參數(shù)。 - Matcher 類:
Matcher 對(duì)象是對(duì)輸入字符串進(jìn)行解釋和匹配操作的引擎。與Pattern 類一樣,Matcher 也沒(méi)有公共構(gòu)造方法。你需要調(diào)用 Pattern 對(duì)象的 matcher 方法來(lái)獲得一個(gè) Matcher 對(duì)象。 - PatternSyntaxException:
PatternSyntaxException 是一個(gè)非強(qiáng)制異常類,它表示一個(gè)正則表達(dá)式模式中的語(yǔ)法錯(cuò)誤。
2、弄清楚( )、[ ]、{ }的作用
-
圓括號(hào)()是組,主要應(yīng)用在限制多選結(jié)構(gòu)的范圍/分組/捕獲文本/環(huán)視/特殊模式處理
示例:
1、(abc|bcd|cde),表示這一段是abc、bcd、cde三者之一均可,順序也必須一致
2、(abc)?,表示這一組要么一起出現(xiàn),要么不出現(xiàn),出現(xiàn)則按此組內(nèi)的順序出現(xiàn)
3、(?:abc)表示找到這樣abc這樣一組,但不記錄,不保存到變量中,否則可以通過(guò)變量中,否則可以通過(guò)變量中,否則可以通過(guò)x取第幾個(gè)括號(hào)所匹配到的項(xiàng),比如:(aaa)(bbb)(ccc)(?:ddd)(eee),可以用$1獲取(aaa)匹配到的內(nèi)容,而$3則獲取到了(ccc)匹配到的內(nèi)容,而$4則獲取的是由(eee)匹配到的內(nèi)容,因?yàn)榍耙粚?duì)括號(hào)沒(méi)有保存變量
4、a(?=bbb) 順序環(huán)視 表示a后面必須緊跟3個(gè)連續(xù)的b
5、(?i:xxxx) 不區(qū)分大小寫(xiě) (?s:.*) 跨行匹配.可以匹配回車符 -
方括號(hào)是單個(gè)匹配,字符集/排除字符集/命名字符集
示例:
1、[0-3],表示找到這一個(gè)位置上的字符只能是0到3這四個(gè)數(shù)字,與(abc|bcd|cde)的作用比較類似,但圓括號(hào)可以匹配多個(gè)連續(xù)的字符,而一對(duì)方括號(hào)只能匹配單個(gè)字符
2、[^0-3],表示找到這一個(gè)位置上的字符只能是除了0到3之外的所有字符
3、[:digit:] 0-9 [:alnum:] A-Za-z0-9 -
{}一般用來(lái)表示匹配的長(zhǎng)度
示例:
1、\s{3} 表示匹配三個(gè)空格
2、\s{1,3}表示匹配一到三個(gè)空格
三、應(yīng)用實(shí)例
1、匹配
匹配數(shù)字案例,用正則表達(dá)式來(lái)判斷字符串中是否全部是數(shù)字:
String str = "123456789"; String reg = "\\d+"; boolean b= str.matches(reg); System.out.println(b);其中\(zhòng)d是正則表達(dá)式的匹配模式,為邊界匹配器——單詞邊界。在java中\(zhòng)代表轉(zhuǎn)義符,所以這里\d應(yīng)該寫(xiě)成“\d”,后邊的+是量詞,代表前面的匹配出現(xiàn)的次數(shù)是一次或多次。
2、切割
String str = "張三.李四.王五"; String reg = "\\."; String[] arr = str.split(reg); System.out.println("切割得到的長(zhǎng)度是:" + arr.length); for(final String s : arr) {System.out.println(s); }上述的正則將字符串中以”.”為界限進(jìn)行切割,得到一個(gè)字符串?dāng)?shù)組,切割得到的字符串放進(jìn)字符串?dāng)?shù)組的元素中,下標(biāo)從0開(kāi)始。如上所述,輸出的結(jié)果是:
切割得到的長(zhǎng)度是:3 張三 李四 王五- 如果字符串是以空格隔開(kāi),那么用的正則如下:
- 空白字符一般喜歡用\s來(lái)代替,所以如果是空格隔開(kāi),那么最好的用法如下:
- 切割重疊詞,將疊詞兩邊的字符串分割出來(lái):
將規(guī)則封裝成一個(gè)組,用()完成。組的出現(xiàn)都有編號(hào),從1開(kāi)始,想要使用已有的組可以通過(guò) \n(n是組的編號(hào))的形式來(lái)獲取。
3、替換
有這么一個(gè)字符串“wer1389980000ty1234564uiod234345675f”,將字符串中的數(shù)組替換成#。
public static void replaceAllDemo(String str,String reg,String newStr) {str = str.replaceAll(reg,newStr);System.out.println(str); }replaceAllDemo(str,"\\d{5,}","#");操作的步奏是,正則先去匹配字符串,如果找到匹配則替換。
替換疊詞,將重疊的字符替換成單個(gè)字符,如:tt->t,調(diào)用的方法還是如上,傳遞的字符串和正則規(guī)則如下:
4、獲取
正則表達(dá)式的第四個(gè)功能:獲取。將字符串中的符合規(guī)則的子串取出。這里必須去了解和使用JAVA封裝的兩個(gè)類:Matcher,Pattern。
String str = "Hello Rgex This is the test text!"; System.out.println(str); String reg = "\\b[a-z]{4}\\b";//將規(guī)則封裝成對(duì)象。 Pattern p = Pattern.compile(reg);//讓正則對(duì)象和要作用的字符串相關(guān)聯(lián)。獲取匹配器對(duì)象。 Matcher m = p.matcher(str);System.out.println(m.matches());其實(shí)String類中的matches方法。用的就是Pattern和Matcher對(duì)象來(lái)完成的。只不過(guò)被String的方法封裝后,用起來(lái)較為簡(jiǎn)單。但是功能卻單一。
public class RegexDemo {public static void main(String[] args) {getDemo();}public static void getDemo(){// 要驗(yàn)證的字符串String str = "Hello,Rgex,This,is,the,test,text!";// 正則表達(dá)式規(guī)則String reg = "[a-zA-Z]{2,4}";// 封裝/編譯正則表達(dá)式Pattern p = Pattern.compile(reg);// 忽略大小寫(xiě)的寫(xiě)法// Pattern pat =Pattern.compile(reg,Pattern.CASE_INSENSITIVE);//讓正則對(duì)象和要作用的字符串相關(guān)聯(lián)。獲取匹配器對(duì)象。Matcher m = p.matcher(str);//輸出結(jié)果while(m.find()) {String result = m.group();System.out.println(result);}} }操作步驟:
1.將正則表達(dá)式封裝成對(duì)象。
2.讓正則對(duì)象和要操作的字符串相關(guān)聯(lián)。
3.關(guān)聯(lián)后,獲取正則匹配引擎。
4.通過(guò)引擎對(duì)符合規(guī)則的子串進(jìn)行操作,比如取出。
5、示例
//以空格分割 String str1 = "1 2 3 4 54 5 6"; String[] numbers = str1.split(" +"); for (String temp : numbers) {System.out.println(temp); }// 替換,替換所有的數(shù)字為* String str2 = "abd123:adad46587:asdadasadsfgi#%^^9090"; System.out.println(str2.replaceAll("[0-9]", "*")); System.out.println(str2.replaceAll("\\d", "*"));// 匹配出3個(gè)字符的字符串 String str = "abc 124 ewqeq qeqe qeqe qeqe aaaa fs fsdfs d sf sf sf sf sfada dss dee ad a f s f sa a'lfsd;'l"; Pattern pt = Pattern.compile("\\b\\w{3}\\b"); Matcher match = pt.matcher(str); while (match.find()) {system.out.println(match.group()); }// 匹配出郵箱地址 String str2 = "dadaadad da da dasK[PWEOO-123- DASJAD@DHSJK.COM DADA@DAD.CN =0KFPOS9IR23J0IS ADHAJ@565@ADA.COM.CN shuqi@162.com UFSFJSFI-SI- "; Pattern pet2 = Pattern.compile("\\b\\w+@\\w+(\\.\\w{2,4})+\\b"); Matcher match2 = pet2.matcher(str2); while (match2.find()) {System.out.println(match2.group()); }四、總結(jié)
正則就是記住規(guī)則,然后多加練習(xí)就能熟練掌握
總結(jié)
以上是生活随笔為你收集整理的JAVA第五课:正则表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: this关键字的作用
- 下一篇: hadoop fs,hadoop dfs