Java 正则表达式
正則表達(dá)式
import java.util.regex.Matcher; import java.util.regex.Pattern;/*** @author ZHR* @version 1.0**/ public class regexp_01 {public static void main(String[] args) {String s = "由于在開(kāi)發(fā)Oak語(yǔ)言時(shí),尚且不存在運(yùn)行字節(jié)碼的硬件平臺(tái),所以為了在開(kāi)發(fā)時(shí)可以對(duì)這種語(yǔ)言進(jìn)行實(shí)驗(yàn)研究,他們就在已有的" +"硬件和軟件平臺(tái)基礎(chǔ)上,按照自己所指定的規(guī)范,用軟件建設(shè)了一個(gè)運(yùn)行平臺(tái),整個(gè)系統(tǒng)除了比C++更加簡(jiǎn)單之外,沒(méi)有什么大的區(qū)" +"別。1992年的夏天,當(dāng)Oak語(yǔ)言開(kāi)發(fā)成功后,研究者們向硬件生產(chǎn)商進(jìn)行演示了Green操作系統(tǒng)、Oak的程序設(shè)計(jì)語(yǔ)言、類庫(kù)和其" +"硬件,以說(shuō)服他們使用Oak語(yǔ)言生產(chǎn)硬件芯片,但是,硬件生產(chǎn)商并未對(duì)此產(chǎn)生極大的熱情。因?yàn)樗麄冋J(rèn)為,在所有人對(duì)Oak語(yǔ)言" +"還一無(wú)所知的情況下,就生產(chǎn)硬件產(chǎn)品的風(fēng)險(xiǎn)實(shí)在太大了,所以O(shè)ak語(yǔ)言也就因?yàn)槿狈τ布闹С侄鵁o(wú)法進(jìn)入市場(chǎng),從而被擱置了下" +"來(lái)。\n" +"1994年6、7月間,在經(jīng)歷了一場(chǎng)歷時(shí)三天的討論之后,團(tuán)隊(duì)決定再一次改變了努力的目標(biāo),這次他們決定將該技術(shù)應(yīng)用于" +"萬(wàn)維網(wǎng)。他們認(rèn)為隨著Mosaic瀏覽器的到來(lái),因特網(wǎng)正在向同樣的高度互動(dòng)的遠(yuǎn)景演變,而這一遠(yuǎn)景正是他們?cè)谟芯€電視網(wǎng)中看" +"到的。作為原型,帕特里克·諾頓寫了一個(gè)小型萬(wàn)維網(wǎng)瀏覽器WebRunner。";//1.\\d表示一個(gè)任意的數(shù)字String regStr = "(\\d\\d)(\\d\\d)";//2.創(chuàng)建模式對(duì)象[即正則表達(dá)式對(duì)象]Pattern pattern = Pattern.compile(regStr);//3.創(chuàng)建匹配器//說(shuō)明:創(chuàng)建匹配器matcher,按照正則表達(dá)式的規(guī)則Matcher matcher = pattern.matcher(s);//4.開(kāi)始匹配//matcher.find() 完成的任務(wù)//1.根據(jù)指定的規(guī)則,定位滿足規(guī)則的子字符串(1998)//2.找到后,將子字符串的開(kāi)始索引記錄到matcher對(duì)象的屬性int[] groups的groups[0]中,// 把子字符串的結(jié)束的索引+1的值記錄到groups[1]//3.同時(shí)記錄oldLast的值為groups[1],即下次執(zhí)行find時(shí),從oldLast開(kāi)始匹配//什么是分組,比如(\\d\\d)(\\d\\d),正則表達(dá)式中有() 表示分組,第一個(gè)()表示第一組,第二個(gè)()表示第二組,以此類推//例如找到(19)(98)//則記錄第一組()匹配到的字符 groups[2]=0 (第一組中1所在的下標(biāo)) groups[3]=1+1=2 (第一組中9所在的下標(biāo)加1)//則記錄第二組()匹配到的字符 groups[4]=2 (第二組中9所在的下標(biāo)) groups[5]=3+1=4 (第二組中8所在的下標(biāo)加1)//調(diào)用時(shí),matcher.group(1)和matcher.group(2)返回第一組和第二組截取的字符串//matcher.group(0)完成的任務(wù)//根據(jù)groups[0]和groups[1]記錄的位置,截取子字符串,即[groups[0],groups[1])//如果正則表達(dá)式取出的組大于定義的組,則由于初始化groups為-1,會(huì)出現(xiàn)數(shù)組越界,建議查看源碼while(matcher.find()){System.out.println("找到:"+matcher.group(0));System.out.println("找到第一組內(nèi)容:"+matcher.group(1));System.out.println("找到第二組內(nèi)容:"+matcher.group(2));}} }一.底層原理
(1).matcher.find() 完成的任務(wù)
1.根據(jù)指定的規(guī)則,定位滿足規(guī)則的子字符串
2.找到后,將子字符串的開(kāi)始索引記錄到matcher對(duì)象的屬性int[] groups的groups[0]中,
把子字符串的結(jié)束的索引+1的值記錄到groups[1]
3.同時(shí)記錄oldLast的值為groups[1],即下次執(zhí)行find時(shí),從oldLast開(kāi)始匹配
(2)matcher.group(0)完成的任務(wù)
根據(jù)groups[0]和groups[1]記錄的位置,截取子字符串,即[groups[0],groups[1])
(3)什么是分組,比如(\d\d)(\d\d),正則表達(dá)式中有() 表示分組,第一個(gè)()表示第一組,第二個(gè)()表示第二組,以此類推
例如找到(19)(98)
則記錄第一組()匹配到的字符 groups[2]=0 (第一組中1所在的下標(biāo)) groups[3]=1+1=2 (第一組中9所在的下標(biāo)加1)
則記錄第二組()匹配到的字符 groups[4]=2 (第二組中9所在的下標(biāo)) groups[5]=3+1=4 (第二組中8所在的下標(biāo)加1)
調(diào)用時(shí),matcher.group(1)和matcher.group(2)返回第一組和第二組截取的字符串
即:matcher.group(0)表示匹配到的字符串,matcher.group(1)表示匹配到的第一組子字符串,matcher.group(2)表示匹配到的第二組子字符串…依此類推
二.正則表達(dá)式語(yǔ)法
(1)轉(zhuǎn)義號(hào)\\
在檢索特殊字符( .*+()$/?[]^{} )時(shí),需要用到\\,否則報(bào)錯(cuò)
在java中,兩個(gè)\\代表其他語(yǔ)言中一個(gè)\
(2)字符匹配符
\\w還可以匹配下劃線
如何不指定大小寫?
\\s匹配任何空白字符
\\S匹配任何非空白字符
(3)選擇匹配符
(4)限定符
Java匹配是貪婪匹配,即盡可能匹配多的
非貪婪匹配,在限定符后面加一個(gè) ?
(5)定位符
\\b邊界可能是字符串最后,也可以是空格的字符串子串的后面
(6)分組
演示代碼:
非捕獲分組
舉例:
三.正則表達(dá)式常用類
1.Pattern.matcher(regStr,content)是整體驗(yàn)證,常用方法,返回Boolean值
2.Pattern常用方法
注意:end()是最后元素的下標(biāo)加1
3.Matcher常用方法
注意:replaceAll("…")返回的才是替換后的字符串,原字符串不變
四.反向引用
舉例
將 我…我要…學(xué)學(xué)學(xué)習(xí)習(xí)Java 變?yōu)?我要學(xué)習(xí)Java
import java.util.regex.Pattern;/*** @author ZHR* @version 1.0**/ public class exercise_03 {public static void main(String[] args) {String str = "我...我要...學(xué)學(xué)學(xué)習(xí)習(xí)Java";//先去除.str = Pattern.compile("\\.").matcher(str).replaceAll("");//再去除重復(fù)的字str = Pattern.compile("(.)\\1+").matcher(str).replaceAll("$1");System.out.println(str);} }驗(yàn)證電子郵件是否合法
import java.util.regex.Matcher; import java.util.regex.Pattern;/*** @author ZHR* @version 1.0**/ public class exercise_04 {public static void main(String[] args) {//驗(yàn)證電子郵件是否合法String content = "1184524381@qq.org.com";String regStr = "^\\w+@([a-zA-Z]+\\.)+[a-zA-Z]+$";//這里使用String的match方法,整體匹配正則表達(dá)式if(content.matches(regStr)){System.out.println("匹配成功");}else{System.out.println("匹配失敗");}} }總結(jié)
以上是生活随笔為你收集整理的Java 正则表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ROS 教程之navigation: 用
- 下一篇: 手工焊锡通用工艺规程