(以下內容全部來自上述課程)
1.正則表達式(regex)
可以校驗字符串是否滿足一定的規則,并用來校驗數據格式的合法性。
1.作用
- 校驗字符串是否滿足規則
- 在一段文本中查找滿足要求的內容
2.內容定義
ps:一個[]只能匹配一個字符。
\:轉義字符,改變后面那個字符原本的含義
\:前面的\是一個轉義字符,改變了后面的\原本的含義,把他變成成一個普普通通的\而已。
簡單來記:兩個\表示一個
API文檔:Pattern會有正則表達式的解釋,所以不需要去背。
插件:any-rule:右鍵可以插入想要的正則表達式:可以刪去首尾的^和$符號,再把一個\加為兩個\。
補充:(?i)忽略后面字母的大小寫
2.爬蟲
正則表達式的第二個作用:在一段文本中查找滿足要求的內容。
分為:本地爬蟲和網絡爬蟲。
Pattern:表示正則表達式。
Matcher:文本匹配器,作用按照正則表達式的規則去讀取字符串,從頭開始讀取。在大串中去找符合匹配規則的子串。
1.本地爬蟲
有如下文本,請按要求爬取數據。
Java自從95年問世以來,經歷了很多版本,目前企業中用的最多的是Java8和Java11,
因為這兩個是長期支持版本,下一個長期支持版本是Java17,相信在未來不久Java17也會逐漸登上歷史舞臺
要求:找出里面所有的JavaXX
package RegexDemo;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Demo1 {/*有如下文本,請按要求爬取數據。Java自從95年問世以來,經歷了很多版本,目前企業中用的最多的是Java8和Java11,因為這兩個是長期支持版本,下一個長期支持版本是Java17,相信在未來不久Java17也會逐漸登上歷史舞臺要求:找出里面所有的JavaXX*/public static void main(String[] args) {String str = "Java自從95年問世以來,經歷了很多版本," +"目前企業中用的最多的是Java8和Java11," +"因為這兩個是長期支持版本,下一個長期支持版本是Java17," +"相信在未來不久Java17也會逐漸登上歷史舞臺";//method1(str);//1.獲取正則表達式對象Pattern pattern = Pattern.compile("Java\\d{0,2}");//2.獲取匹配器對象//拿著matcher對象去讀取strMatcher matcher = pattern.matcher(str);//3.開始讀取while(matcher.find()) {String s = matcher.group();System.out.println(s);}}private static void method1(String str) {//獲取正則表達式對象Pattern pattern = Pattern.compile("Java\\d{0,2}");//獲取匹配器對象//m:文本匹配器的對象//str:大串//p:規則//m要在str中找到符合p規則的小串Matcher m = pattern.matcher(str);//拿著文本匹配器從頭開始讀取,尋找是否有滿足規則的子串//如果沒有,返回false//如果有,返回true。在底層記錄子串的起始索引和結束索引+1//0,4boolean b = m.find();//方法底層會根據find方法記錄的索引,從大串中截取子串//subString(起始索引,結尾索引);包含起始索引,不包含結尾索引//0,4 [0,4) 不包含4索引//會把截取的子串返回String s1 = m.group();System.out.println(s1);//繼續尋找b = m.find();String s2 = m.group();System.out.println(s2);}
}
2.網絡爬蟲(了解)
3.帶條件的爬取
有如下文本,請按要求爬取數據。
Java自從95年問世以來,經歷了很多版本,目前企業中用的最多的是Java8和Java11,
因為這兩個是長期支持版本,下一個長期支持版本是Java17,相信在未來不久Java17也會逐漸登上歷史舞臺
需求1:爬取版本號為8,11,17的Java文本,但是只要Java,不顯示版本號。
需求2:爬取版本號為8,11,17的Java文本。正確爬取結果為:Java8,Java11,Java17,Java17
需求3:爬取除了版本號為8,11,17的Java文本。
package RegexDemo;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Demo2 {/*有如下文本,請按要求爬取數據。Java自從95年問世以來,經歷了很多版本,目前企業中用的最多的是Java8和Java11,因為這兩個是長期支持版本,下一個長期支持版本是Java17,相信在未來不久Java17也會逐漸登上歷史舞臺需求1:爬取版本號為8,11,17的Java文本,但是只要Java,不顯示版本號。需求2:爬取版本號為8,11,17的Java文本。正確爬取結果為:Java8,Java11,Java17,Java17需求3:爬取除了版本號為8,11,17的Java文本。*/public static void main(String[] args) {String str = "Java自從95年問世以來,經歷了很多版本," +"目前企業中用的最多的是Java8和Java11," +"因為這兩個是長期支持版本,下一個長期支持版本是Java17," +"相信在未來不久Java17也會逐漸登上歷史舞臺";//1.定義正則表達式//?理解為前面的數據Java//=表示在Java后面要跟隨的數據//()但是獲取的時候,只獲取前半部分//需求1:String regex1 = "Java(?=8|11|17)";//需求2:String regex2 = "Java(8|11|17)";String regex3 = "Java(?:8|11|17)";//需求3:String regex4 = "Java(?!8|11|17)";Pattern pattern = Pattern.compile(regex4);Matcher matcher = pattern.matcher(str);while(matcher.find()) {System.out.println(matcher.group());}}
}
4.貪婪爬取和非貪婪爬取
有如下文本,請按要求爬取數據。
Java自從95年問世以來,abbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaa,經歷了很多版本,目前企業中用的最多的是Java8和Java11,
因為這兩個是長期支持版本,下一個長期支持版本是Java17,相信在未來不久Java17也會逐漸登上歷史舞臺
需求1:按照ab+的方法爬取ab,b盡可能多獲取 --------------貪婪爬取
需求2:按照ab+的方法爬取ab,b盡可能少獲取 --------------非貪婪爬取
Java當中,默認的就是貪婪爬取
如果我們在數量詞+ *的后面加上問號,就是非貪婪爬取。
package RegexDemo;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Demo3 {/*有如下文本,請按要求爬取數據。Java自從95年問世以來,abbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaa,經歷了很多版本,目前企業中用的最多的是Java8和Java11,因為這兩個是長期支持版本,下一個長期支持版本是Java17,相信在未來不久Java17也會逐漸登上歷史舞臺需求1:按照ab+的方法爬取ab,b盡可能多獲取 --------------**貪婪爬取**需求2:按照ab+的方法爬取ab,b盡可能少獲取 --------------**非貪婪爬取***/public static void main(String[] args) {String str = "Java自從95年問世以來,abbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaa, " +"經歷了很多版本,目前企業中用的最多的是Java8和Java11, " +"因為這兩個是長期支持版本,下一個長期支持版本是Java17,相信在未來不久Java17也會逐漸登上歷史舞臺";String regex1 = "ab+";String regex2 = "ab+?";Pattern pattern = Pattern.compile(regex1);Matcher matcher = pattern.matcher(str);while(matcher.find()) {System.out.println(matcher.group());}}
}
3.正則表達式在字符串中的使用
4.分組
分組就是個小括號。
每組是有組號的,也就是序號。
- 從1開始,連續不間斷。
- 以左括號為基準,最左邊的是第一組,其次為第二組。
1.捕獲分組
捕獲分組就是把這一組的數據捕獲出來,再用一次。
后續還需要使用本組的數據:
- 正則內部使用:\組號
- 正則外部使用:$組號
//需求1:
String regex1 = "(.).+\\1";
//需求2:
String regex2 = " (.+).+\\1";
//需求3:
//(.):把首字母看成一組
//\\2:把首字母拿出來再次使用
//*:作用于\\2,表示后面重復的內容出現0次或多次
String regex3 ="((.)\\2*).+\\1";
將字符串:我要學學編編編編程程程程程程
替換為:我要學編程
package RegexDemo;public class Demo4 {/*將字符串:我要學學編編編編程程程程程程替換為:我要學編程*/public static void main(String[] args) {String str = "我要學學編編編編程程程程程程";//(.)表示任意字符//\\1表示第一字符再次出現//+至少一次//$1表示把正則表達式中的第一個分組的內容,再拿出來用String s = str.replaceAll("(.)\\1+", "$1");System.out.println(s);}
}
2.非捕獲分組
分組后不需要再用本組數據,僅僅是把數據括起來。