第七週進度報告

XYu1230發表於2024-08-17

爬蟲

  • 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("時間相等");
    }
}