爬蟲
- Pattern: 表示正規表示式
- Matcher: 文字匹配器,作用按照正規表示式的規則去讀取字串,從頭開始讀取,在大串上去找符合匹配規則的子串
String s = "Java自從95年問世以來,經歷了很多版本,目前企業中用的最多的是Java8和Java11,因為這兩個版本是長期支援版本," + "下一個長期支援的版本是" +
"Java17,相信未來不久Java17也會逐漸登上歷史舞臺.";
//1.獲取正規表示式的物件
Pattern p = Pattern.compile("Java\\d{0,2}");
//2.獲取文字匹配器的物件 拿著m去讀取s,找符合p規則的字串
Matcher m = p.matcher(s);
//3.利用迴圈讀取
while(m.find()){
System.out.println(m.group());
}
帶條件爬取
/*
需求1: 爬取版本號為8,11,17的Java文字,但是隻要Java,不顯示版本號。
需求2: 爬取版本號為8,11,17的Java文字。正確爬取結果為: Java8 Java11 Java17 Java17
需求3: 爬取除了版本號為8,11,17的Java文字,
**/
String s = "Java自從95年問世以來,經歷了很多版本,目前企業中用的最多的是Java8和Java11,因為這兩個版本是長期支援版本," + "下一個長期支援的版本是" +
"Java17,相信未來不久Java17也會逐漸登上歷史舞臺.";
//需求1: ?理解為前面的資料java,=表示在java後面要跟隨的資料,但是在獲取之前,只獲取前半部分
String regex1 = "(?i)(java)(?=8|11|17)";
//需求2:
String regex2 = "(?i)(java)(?:8|11|17)";
//需求3:
String regex3 = "(?i)(java)(?!8|11|17)";
//1.獲取正規表示式的物件
Pattern p = Pattern.compile(regex3);
//2.獲取文字匹配器的物件 拿著m去讀取s,找符合p規則的字串
Matcher m = p.matcher(s);
//3.利用迴圈讀取
while(m.find()){
System.out.println(m.group());
}
貪婪爬取和非貪婪爬取
- 貪婪爬取:在爬取資料的時候儘可能的多獲取資料
- 非貪婪爬取: 在爬取資料的時候儘可能地少獲取資料
public static void main(String[] args) {
String s = "klklklkkljxzcnxzncklxznkvabbbbbbbbbbbbbbbbbbbbxjvkj";
//1.貪婪爬取
String regex1 = "ab+";
//2.非貪婪爬取
String regex2 = "ab+?";
Pattern p = Pattern.compile(regex2);
Matcher m = p.matcher(s);
while(m.find()){
System.out.println(m.group());
}
}
正規表示式在字串方法中的使用
public static void main(String[] args) {
String s = "你dskadhjksaj我dhsjadhjkls大帥哥dsaldjs666";
String regex = "[\\w&&[^_]]+";
//replaceAll
System.out.println(s.replaceAll(regex,"樂"));
//split
String[] arr = s.split(regex);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
//matches
System.out.println(s);
System.out.println(s.matches(regex));
}
分組捕獲和非分組捕獲
分組規則
public static void main(String[] args) {
//分組捕獲
String s = "ads12d1sa";
String regex = "(.).+\\1";
System.out.println(s.matches(regex));
String s2 = "abcds12d31sabc";
String regex2 = "(.+).+\\1";
System.out.println(s.matches(regex2));
String s3 = "aaagf132h1fgaab";
String regex3 = "((.)\\2)*.+\\1";
System.out.println(s3.matches(regex3));
//正則內部用\\,外部用組的內容用$
String s4 = "我我我我我啦啦啦啦啦啦啦啦啦哈哈哈哈哈哈哈哈哈啊啊啊啊啊";
System.out.println(s4.replaceAll("(.)\\1+","$1"));
}
非捕獲分組: 僅僅是吧資料括起來,不佔用組號
常見API
Date
時間有關的知識點
public static void main(String[] args) {
/*
public Date(); // 建立Data物件,表示當前時間
public Date(long data) //建立Data物件,表示指定時間
public void setTime(long time) //設定/修改 (time)毫秒值
public long getTime() //獲取時間物件的毫秒值
*/
Date d1 = new Date();
System.out.println(d1);
Date d2 = new Date(1000L);
System.out.println(d2);
long l = d2.getTime();
System.out.println(l);
}
public static void main(String[] args) {
//時間計算
Date d1 = new Date(0L);
long time = d1.getTime();
time += 1000L * 60 * 60 * 24 * 365; //獲取一年後的時間
d1.setTime(time);
System.out.println(d1);
//時間比較
Random r = new Random();
Date d2 = new Date(Math.abs(r.nextInt()));
Date d3 = new Date(Math.abs(r.nextInt()));
System.out.println("d2: " + d2.getTime());
System.out.println("d3: " + d3.getTime());
if(d2.getTime() > d3.getTime()){ //取出毫秒值進行比較
System.out.println("d3在前");
}
else if(d2.getTime() < d3.getTime()){
System.out.println("d2在前");
}
else {
System.out.println("時間相等");
}
}