柚子快報(bào)邀請(qǐng)碼778899分享:【JavaSE】之正則表達(dá)式
柚子快報(bào)邀請(qǐng)碼778899分享:【JavaSE】之正則表達(dá)式
【JavaSE】正則表達(dá)式
前言一、正則表達(dá)式簡(jiǎn)介1.正則表達(dá)式是什么2.正則表達(dá)式怎么用
二、普通字符三、非打印字符四、特殊字符五、限定符六、定位符后記
前言
本文為Java基礎(chǔ)正則表達(dá)式相關(guān)知識(shí)介紹,Java全棧學(xué)習(xí)路線(xiàn)可參考:【Java全棧學(xué)習(xí)路線(xiàn)】最全的Java學(xué)習(xí)路線(xiàn)及知識(shí)清單,Java自學(xué)方向指引,內(nèi)含最全Java全棧學(xué)習(xí)技術(shù)清單~
一、正則表達(dá)式簡(jiǎn)介
1.正則表達(dá)式是什么
正則表達(dá)式,又稱(chēng)規(guī)則表達(dá)式。(英語(yǔ):Regular Expression,在代碼中常簡(jiǎn)寫(xiě)為regex、regexp或RE),計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表達(dá)式通常被用來(lái)檢索、替換那些符合某個(gè)模式(規(guī)則)的文本。在眾多語(yǔ)言中都可以支持正則表達(dá)式,如Perl、PHP、Java、Python、Ruby等。當(dāng)然在Java中也可以通過(guò)處理字符串的方式達(dá)到檢索,替換文本字符串的目的,但是有了正則表達(dá)式寫(xiě)代碼更加簡(jiǎn)潔,通常兩三行代碼就可以達(dá)到目的,當(dāng)然這也是建立在熟悉正則表達(dá)式的基礎(chǔ)之上的。
2.正則表達(dá)式怎么用
正則表達(dá)式的使用分為只使用Pattern類(lèi)與兩個(gè)類(lèi)聯(lián)合使用:Pattern、Matcher兩種方式。
只使用Pattern類(lèi)
boolean Pattern.matches(String regex,CharSequence input)
regex:正則表達(dá)式input:要匹配的字符串
String str="12dr 32 d2d";
System.out.println(Pattern.matches("\\d+", str)); // 一定要全部是數(shù)字才行返回true
String[] Pattern.split(CharSequence input)
分割字符串
Pattern p=Pattern.compile("\\d+");
String[] str=p.split("a1b1c1");
// 結(jié)果:
// str[0]="a" str[1]="b" str[2]="c"
Pattern、Matcher聯(lián)合使用 Pattern、Matcher聯(lián)合使用可以多次匹配和對(duì)正則表達(dá)式的分組支持
Matcher.matches()
看是否全部為正則表達(dá)式的類(lèi)型,返回布爾值
Pattern compile = Pattern.compile("\\d+");
Matcher matcher = compile.matcher("22bb11");
System.out.println(matcher.matches());// 返回false,因?yàn)?22bb11"不全部是數(shù)字
// 結(jié)果:
// false
lookingAt()
只看第一個(gè)匹配到的是不是正則表達(dá)式要的
Pattern compile = Pattern.compile("\\d+");
Matcher matcher = compile.matcher("22bb11");
System.out.println(matcher.lookingAt());// 返回true,因?yàn)?22bb11"開(kāi)頭是數(shù)字
// 結(jié)果:
// true
find()
對(duì)字符串進(jìn)行匹配,匹配到的字符串可以在任何位置
Pattern compile = Pattern.compile("\\d+");
Matcher matcher = compile.matcher("22bb11");
System.out.println(matcher.find());// 返回true,因?yàn)?22bb11"中有數(shù)字?jǐn)?shù)字
當(dāng)使用matches(),lookingAt(),find()執(zhí)行匹配操作后,就可以利用以下三個(gè)方法得到更詳細(xì)的信息
start()返回匹配到的子字符串在字符串中的索引位置end()返回匹配到的子字符串的最后一個(gè)字符在字符串中的索引位置group()返回匹配到的子字符串
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("aaa2223bb");
m.find();//匹配2223 // 必寫(xiě),調(diào)用此方法后才能調(diào)用后面的三個(gè)方法
m.start();//返回3
m.end();//返回7,返回的是2223后的索引號(hào)
m.group();//返回2223
正則表達(dá)式還包括捕獲組的操作
"((\\d+)(.*))" // 一個(gè)括號(hào)中包含兩個(gè)括號(hào),每個(gè)括號(hào)中代表一種正則表達(dá)式,我們可以利用組的操作去獲取不同數(shù)據(jù)類(lèi)型的數(shù)據(jù)。
在 java 中start(),end(),group()均有一個(gè)重載方法
start(int i),end(int i),group(int i)專(zhuān)用于分組操作,Mathcer類(lèi)還有一個(gè)groupCount()用于返回有多少組
代碼示例:
Pattern p=Pattern.compile("([a-z]+)(\\d+)");
Matcher m=p.matcher("aaa2223bb");
m.find(); //匹配aaa2223
m.groupCount(); //返回2,因?yàn)橛?組
m.start(1); //返回0 返回第一組匹配到的子字符串在字符串中的索引號(hào)
m.start(2); //返回3
m.end(1); //返回3 返回第一組匹配到的子字符串的最后一個(gè)字符在字符串中的索引位置.
m.end(2); //返回7
m.group(1); //返回aaa,返回第一組匹配到的子字符串
m.group(2); //返回2223,返回第二組匹配到的子字符串
二、普通字符
普通字符包括沒(méi)有顯式指定為元字符的所有可打印和不可打印字符。這包括所有大寫(xiě)和小寫(xiě)字母、所有數(shù)字、所有標(biāo)點(diǎn)符號(hào)和一些其他符號(hào)。
字符描述[ABC]匹配 […] 中的所有字符[^ABC]匹配除了 […] 中字符的所有字符[A-Z]匹配所有大寫(xiě)字母[a-z]匹配所有小寫(xiě)字母.匹配除換行符(\n、\r)之外的任何單個(gè)字符,相等于 [^\n\r][\s\S]匹配所有。\s 是匹配所有空白符,包括換行,\S 非空白符,不包括換行。\w匹配字母、數(shù)字、下劃線(xiàn)。等價(jià)于 [A-Za-z0-9_]
三、非打印字符
非打印字符也可以是正則表達(dá)式的組成部分。
字符描述\cx匹配由x指明的控制字符。例如, \cM 匹配一個(gè) Control-M 或回車(chē)符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個(gè)原義的 ‘c’ 字符。\f匹配一個(gè)換頁(yè)符。等價(jià)于 \x0c 和 \cL。\n匹配一個(gè)換行符。等價(jià)于 \x0a 和 \cJ。\r匹配一個(gè)回車(chē)符。等價(jià)于 \x0d 和 \cM。\s匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于 [ \f\n\r\t\v]。\S匹配任何非空白字符。等價(jià)于 [^ \f\n\r\t\v]。\t匹配一個(gè)制表符。等價(jià)于 \x09 和 \cI。\v匹配一個(gè)垂直制表符。等價(jià)于 \x0b 和 \cK。
四、特殊字符
特殊字符,就是一些有特殊含義的字符,如上面說(shuō)的 runoob 中的 ,簡(jiǎn)單的說(shuō)就是表示任何字符串的意思。如果要查找字符串中的符號(hào),則需要對(duì) 進(jìn)行轉(zhuǎn)義,即在其前加一個(gè) \許多元字符要求在試圖匹配它們時(shí)特別對(duì)待。若要匹配這些特殊字符,必須首先使字符”轉(zhuǎn)義”,即,將反斜杠字符\ 放在它們前面
字符描述$匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,則 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,請(qǐng)使用 $。( )標(biāo)記一個(gè)子表達(dá)式的開(kāi)始和結(jié)束位置。*匹配前面的子表達(dá)式零次或多次。要匹配 * 字符,前面加上 \ 。+匹配前面的子表達(dá)式一次或多次。要匹配 + 字符,前面加上 \。.匹配除換行符 \n 之外的任何單字符。要匹配 . ,前面加上 \ 。[標(biāo)記一個(gè)中括號(hào)表達(dá)式的開(kāi)始?匹配前面的子表達(dá)式零次或一次\將下一個(gè)字符標(biāo)記為或特殊字符、或原義字符、或向后引用、或八進(jìn)制轉(zhuǎn)義符^非{標(biāo)記限定符表達(dá)式的開(kāi)始
五、限定符
字符描述*匹配前面的子表達(dá)式零次或多次。例如,zo 能匹配 “z” 以及 “zoo”。 等價(jià)于{0,}。+匹配前面的子表達(dá)式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等價(jià)于 {1,}。?匹配前面的子表達(dá)式零次或一次。例如,”do(es)?” 可以匹配 “do” 、 “does” 中的 “does” 、 “doxy” 中的 “do” 。? 等價(jià)于 {0,1}。{n}n 是一個(gè)非負(fù)整數(shù)。匹配確定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的兩個(gè) o。{n,}n 是一個(gè)非負(fù)整數(shù)。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有o?!痮{1,}’ 等價(jià)于 ‘o+’?!痮{0,}’ 則等價(jià)于 ‘o*’。{n,m}m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 將匹配 “fooooood” 中的前三個(gè) o。’o{0,1}’ 等價(jià)于 ‘o?’。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格。
例1:/[1-9][0-9]*/ [1-9]設(shè)置第一個(gè)數(shù)字不是 0,[0-9]* 表示任意多個(gè)數(shù)字
例2:/[0-9]{1,2}/ 匹配 0~99 的兩位數(shù) 缺點(diǎn)是:只能匹配兩位數(shù)字,而且可以匹配 0、00、01、10 99 等編號(hào)仍只匹配開(kāi)頭兩位數(shù)字。
例3:/[1-9][0-9]?/ 或 /[1-9][0-9]{0,1}/ 匹配 1~99 的正整數(shù)
六、定位符
定位符用來(lái)描述字符串或單詞的邊界,^ 和 $ 分別指字符串的開(kāi)始與結(jié)束,\b 描述單詞的前或后邊界,\B 表示非單詞邊界。
字符描述^匹配輸入字符串開(kāi)始的位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,^ 還會(huì)與 \n 或 \r 之后的位置匹配。$匹配輸入字符串結(jié)尾的位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,$ 還會(huì)與 \n 或 \r 之前的位置匹配。\b匹配一個(gè)單詞邊界,即字與空格間的位置。\B非單詞邊界匹配。
注意:
不能將限定符與定位符一起使用。由于在緊靠換行或者單詞邊界的前面或后面不能有一個(gè)以上位置,因此不允許諸如 ^* 之類(lèi)的表達(dá)式。若要匹配一行文本開(kāi)始處的文本,請(qǐng)?jiān)谡齽t表達(dá)式的開(kāi)始使用 ^ 字符。不要將 ^ 的這種用法與中括號(hào)表達(dá)式內(nèi)的用法混淆。若要匹配一行文本的結(jié)束處的文本,請(qǐng)?jiān)谡齽t表達(dá)式的結(jié)束處使用 $ 字符。
例子:
/^Chapter [1-9][0-9]{0,1}$/ :匹配Chapter 1到Chapter 99的字符/\bCha/ :匹配Cha開(kāi)頭的單詞/ter\b/ :匹配ter結(jié)尾的單詞/\Bapt/ :匹配 Chapter 中的字符串 apt,但不匹配 aptitude 中的字符串 apt
后記
Java全棧學(xué)習(xí)路線(xiàn)可參考:【Java全棧學(xué)習(xí)路線(xiàn)】最全的Java學(xué)習(xí)路線(xiàn)及知識(shí)清單,Java自學(xué)方向指引,內(nèi)含最全Java全棧學(xué)習(xí)技術(shù)清單~
柚子快報(bào)邀請(qǐng)碼778899分享:【JavaSE】之正則表達(dá)式
好文鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。