識別正則表達式的方法
方法名 | 說明 |
public String[] matches(String regex) | 判斷字符串是否滿足 正則表達式的規則 |
public string replaceAll(String regex,string newstr) | 按照正則表達式的 規則進行替換 |
public string[] split(String regex) | 按照正則表達式的 規則切割字符串 |
代碼實現:
public class Test11 {public static void main(String[] args) {//第一個方法之前已經使用,主要演示后兩個方法String str = "熊大mnduub熊二jnjdnjb光頭強";String regex = "\\w+";String s = str.replaceAll(regex, "vs");System.out.println(s);//熊大vs熊二vs光頭強String[] splitArr = str.split(regex);for (int i = 0; i < splitArr.length; i++) {System.out.println(splitArr[i]);}//熊大//熊二//光頭強}
}
捕獲分組:
一個括號代表一組,捕獲分組就是把這一組的數據捕獲出來,再用一次。
正則內部使用:\\組號
正則外部使用:$組號
組號定義規則:
從1開始,連續不間斷
以左括號為基準,最左邊的是第一組,其次為第二組,以此類推?
案例演示:
需求1:正則內部使用
判斷一個字符串的開始字符和結束字符是否一致,只考慮一個字符
舉例:a123a? b456b? 17891? &abc&
判斷一個字符串的開始部分和結束部分是否一致,可以有多個字符
舉例:abc123abc? b456b? 123789123? &!@abc&!@
需求3:判斷一個字符串的開始部分和結束部分是否一致,開始部分每個字符也需要一致
舉例:aaa123aaa? bbb456bbb? 111789111? &&abc&&?
代碼實現:
public class Test12 {public static void main(String[] args) {//判斷一個字符串的開始字符和結束字符是否一致,只考慮一個字符//舉例:a123a b456b 17891 &abc&//判斷一個字符串的開始部分和結束部分是否一致,可以有多個字符//舉例:abc123abc b456b 123789123 &!@abc&!@//需求3:判斷一個字符串的開始部分和結束部分是否一致,開始部分每個字符也需要一致//舉例:aaa123aaa bbb456bbb 111789111 &&abc&&//首字符任意,結束字符與首字符相同,首字符將捕獲出來,再用一次//首字符:(.)//中間部分:.+//結束字符:\\1String regex1 = "(.).+\\1";System.out.println("a123a".matches(regex1));//trueSystem.out.println("b456b".matches(regex1));//trueSystem.out.println("17891".matches(regex1));//trueSystem.out.println("&abc&".matches(regex1));//trueSystem.out.println("&abcz".matches(regex1));//falseSystem.out.println("-------------------");//開始部分可以有多個字符,結束部分與其一致,將開始部分捕獲出來,再用一次//開始部分:(.+)//中間部分:.+//結束部分:\\1String regex2 = "(.+).+\\1";System.out.println("abc123abc".matches(regex2));//trueSystem.out.println("b456b".matches(regex2));//trueSystem.out.println("123789123".matches(regex2));//trueSystem.out.println("&!@abc&!@".matches(regex2));//trueSystem.out.println("&!@abc&!x".matches(regex2));//falseSystem.out.println("-------------------");//開始部分可以有多個字符,每個字符也需要一致//結束部分與開始部分一致,將開始部分捕獲出來,再用一次//開始部分:((.)\\2*)) (.)為第二組,需要重復,可以捕獲出來用//中間部分:.+//結束部分:\\1String regex3 = "((.)\\2*).+\\1";System.out.println("aaa123aaa".matches(regex3));//trueSystem.out.println("bbb456bbb".matches(regex3));//trueSystem.out.println("111789111".matches(regex3));//trueSystem.out.println("&&abc&&".matches(regex3));//trueSystem.out.println("aaa123aaz".matches(regex3));//false}
}
需求2:正則外部使用
將字符串:我要學學編編編編程程程程程程
替換為:我要學編程
代碼實現:
public class Test13 {public static void main(String[] args) {//將字符串:我要學學編編編編程程程程程程//替換為:我要學編程String str = "我要學學編編編編程程程程程程";//(.) 表示把重復內容的第一個字符看做一組//\\1 表示第一字符再次出現//+ 表示至少一次//$1 表示把正則表達式中第一組的內容,再拿出來用String s = str.replaceAll("(.)\\1+", "$1");System.out.println(s);//我要學編程}
}
非捕獲分組:
分組之后不需要再用本組數據,僅僅是把數據括起來。
符號 | 含義 | 舉例 |
(?:正則) | 獲取所有 | Java(?:8|11|17) |
(?=正則) | 獲取前面部分 | Java(?=8|11|17) |
(?!正則) | 獲取不是指定內容的前面部分 | Java(?!8|11|17) |
代碼演示:
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Test9 {public static void main(String[] args) {String str = "Java自從95年問世以來,經歷了很多版本,目前企業中用的最多的是Java8和Java11," +"因為這兩個是長期支持版本,下一個長期支持版本是Java17,相信在未來不久Java17也會逐漸登上歷史舞臺";//需求1//其中 ?是占位符代表字符串Java,=表示字符串Java后面連接的部分//但是在獲取的時候,只獲取=前半部分String regex1 = "Java(?=8|11|17)";//調用方法進行爬蟲show(regex1,str);//Java//Java//Java//Java//需求2//方式1:常規方式String regex2 = "Java(8|11|17)";show(regex2,str);//Java8//Java11//Java17//Java17//方式2:?是占位符代表字符串Java,:表示字符串Java后面連接的部分//在獲取的時候,可以全部獲取String reges3 = "Java(?:8|11|17)";show(reges3,str);//Java8//Java11//Java17//Java17//需求3//?是占位符代表字符串Java,!表示字符串Java后面連接的部分///在獲取的時候,獲取的是除了與!后面連接匹配的子串String regex4 = "Java(?!8|11|17)";show(regex4,str);//Java}//抽取一個方法進行爬蟲public static void show(String regex,String str){Pattern p = Pattern.compile(regex);Matcher m = p.matcher(str);while(m.find()){String s = m.group();System.out.println(s);}}
}