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