JAVA-常用API(二)

目錄

1.Arrays

1.1認識Arrays

?1.2Arrays的排序

?2.JDK8的新特性:Lambda表達式

2.1認識Lambda表達式

?2.2用Lambda表達式簡化代碼、省略規則

3.JDK8的新特性:方法引用(進一步簡化Lambda表達式)

3.1 靜態方法引用

3.2 實例方法引用

3.3 特定類型方法的引用

3.4 構造器引用

4.常見算法

4.1 冒泡?編輯

4.2 選擇排序

4.3 二分查找

5.正則表達式

5.1 概述

5.2 正則表達式書寫規則

?5.3 正則表達式案例

5.4 正則爬取內容

5.5 搜索、分割


1.Arrays

1.1認識Arrays

package com.itheima.d1_array;import java.util.Arrays;
import java.util.function.IntToDoubleFunction;public class ArraysDemo1 {public static void main(String[] args) {// 目標:掌握操作數組的工具類:Arrays的常見方法。// 1、返回數組內容:   public static String toString(類型[] a)int[] arr = {11, 55, 33, 22, 98};//System.out.println(arr);//[I@10f87f48//數組默認返回的是地址String result = Arrays.toString(arr);//自動封裝好System.out.println(result);// 2、拷貝數組的內容到一個新的數組,并返回新數組// public static 類型[] copyOfRange(類型[] original, int from, int to)int arr2[] = Arrays.copyOfRange(arr,1,4);//包前不包后System.out.println(Arrays.toString(arr2));// 3、給數組擴容。// public static 類型[] copyOf(類型[] original, int newLength)int[] arr3 = Arrays.copyOf(arr, 10);System.out.println(Arrays.toString(arr3));// 4、修改數組中每個數據,再存入。double[] scores = {99.5, 90, 59.5, 78, 98, 55};//需求:為每個分數加分10分//第二個參數為接口類型的對象參數,但是接口不能直接new對象,所以需要用匿名內部類Arrays.setAll(scores, new IntToDoubleFunction() {@Overridepublic double applyAsDouble(int index) {return scores[index] + 10;}});System.out.println(Arrays.toString(scores));// 5、Arrays類提供的對數組進行排序的操作。Arrays.sort(scores);//升序排序(由小到大)System.out.println(Arrays.toString(scores));}
}

?1.2Arrays的排序

package com.itheima.d1_array;import java.util.Arrays;
import java.util.Comparator;public class ArraysDemo2 {public static void main(String[] args) {// 目標:給存儲對象的數組進行排序。Student[] students = new Student[4]; // students = [null, null, null, null]//                                                   0     1     2     3students[0] = new Student("周芷若", 21, '女', 169.3);students[1] = new Student("殷素素", 38, '女', 172.2);students[2] = new Student("小昭", 19, '女', 168.5);students[3] = new Student("張無忌", 23, '男', 183.5);// 自定義排序規則方式一:讓對象所在的類實現比較規則接口Comparable,重寫compareTo方法,來指定比較規則。
//        Arrays.sort(students);// 自定義排序規則方式二:sort存在重載的方法,支持自帶Comparator比較器對象來直接指定比較規則(優先)//  public static <T> void sort(T[] a, Comparator<? super T> c)Arrays.sort(students, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {// return o1.getAge() - o2.getAge(); // 升序//那么如果要按照身高來進行排序呢?//return o1.getHeight() - o2.getHeight();//報錯,因為height是double類型,而方法的返回值類型是int
//                if(o1.getHeight() > o2.getHeight()){
//                    return 1;
//                }else if(o1.getHeight() < o2.getHeight()){
//                    return -1;
//                }
//                return 0;return Double.compare(o1.getHeight(), o2.getHeight());}});System.out.println(Arrays.toString(students));}
}
package com.itheima.d1_array;
// 自定義排序規則方式一:讓對象所在的類實現比較規則接口Comparable,重寫compareTo方法,來指定比較規則。
public class Student implements Comparable<Student>{private String name;private int age;private char gender;private double height;public Student() {}public Student(String name, int age, char gender, double height) {this.name = name;this.age = age;this.gender = gender;this.height = height;}// 指定大小規則// 比較者:this// 被比較者:o@Overridepublic int compareTo(Student o) {/*** 官方規定:* 如果您認為左邊大于右邊,請返回正整數。* 如果您認為左邊小于右邊,請返回負整數。* 如果您認為左邊等于右邊,請返回0。* 只要這么干,默認就是升序排序*/
//        if(this.age > o.age) {
//            return 1;
//        }else if(this.age < o.age) {
//            return -1;
//        }
//        return 0;//return this.age - o.age; // 升序。return o.age - this.age; // 降序。}/*** 獲取* @return name*/public String getName() {return name;}/*** 設置* @param name*/public void setName(String name) {this.name = name;}/*** 獲取* @return age*/public int getAge() {return age;}/*** 設置* @param age*/public void setAge(int age) {this.age = age;}/*** 獲取* @return gender*/public char getGender() {return gender;}/*** 設置* @param gender*/public void setGender(char gender) {this.gender = gender;}/*** 獲取* @return height*/public double getHeight() {return height;}/*** 設置* @param height*/public void setHeight(double height) {this.height = height;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", gender=" + gender +", height=" + height +'}' + "\n";}}

?2.JDK8的新特性:Lambda表達式

2.1認識Lambda表達式

package com.itheima.d2_lambda;public class LambdaTest1 {public static void main(String[] args) {// 目標:認識Lambda是如何簡化匿名內部類的。Animal a1 = new Animal() {@Overridepublic void run() {System.out.println("🐅跑的賊快~~~~");}};a1.run();// 錯誤示范:Lambda并不能簡化所有匿名內部類的代碼。只能簡化函數式接口的匿名內部類。
//        Animal a2 = () -> {
//            System.out.println("🐅跑的賊快~~~~");
//        };
//        a2.run();Swimming s1 = new Swimming() {@Overridepublic void swim() {System.out.println("學生🏊?賊溜~~~~");}};s1.swim();// Lambda可以簡化函數式接口的匿名內部類// 可以簡化的原因:可以上下文推斷出真實的代碼形式!Swimming s2 = () -> {System.out.println("老師🏊?賊溜~~~~");};s2.swim();}
}@FunctionalInterface // 函數式接口中有且僅有一個抽象方法
interface Swimming{void swim();
}abstract class Animal{public abstract void run();
}

?2.2用Lambda表達式簡化代碼、省略規則

import com.itheima.d1_array.Student;import java.util.Arrays;
import java.util.Comparator;
import java.util.function.IntToDoubleFunction;public class LambdaTest2 {public static void main(String[] args) {// 目標:掌握Lambda表達式簡化常見函數式接口的匿名內部類double[] scores = {99.5, 90, 59.5, 78, 98, 55};// 需求:為每個分數加分10分。Arrays.setAll(scores, new IntToDoubleFunction() {@Overridepublic double applyAsDouble(int index) {return scores[index] + 10;}});Arrays.setAll(scores, (int index) -> {return scores[index] + 10;});Arrays.setAll(scores, (index) -> {return scores[index] + 10;});Arrays.setAll(scores, index -> {return scores[index] + 10;});Arrays.setAll(scores, index -> scores[index] + 10 );System.out.println(Arrays.toString(scores));System.out.println("---------------------------------------------------------------------");Student[] students = new Student[4]; // students = [null, null, null, null]//                                                   0     1     2     3students[0] = new Student("周芷若", 21, '女', 169.3);students[1] = new Student("殷素素", 38, '女', 172.2);students[2] = new Student("小昭", 19, '女', 168.5);students[3] = new Student("張無忌", 23, '男', 183.5);Arrays.sort(students, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return Double.compare(o1.getHeight(), o2.getHeight());}});Arrays.sort(students, (Student o1, Student o2) -> {return Double.compare(o1.getHeight(), o2.getHeight());});Arrays.sort(students, (o1, o2) -> {return Double.compare(o1.getHeight(), o2.getHeight());});Arrays.sort(students, (o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight()));System.out.println(Arrays.toString(students));}
}

3.JDK8的新特性:方法引用(進一步簡化Lambda表達式)

3.1 靜態方法引用

package com.itheima.d3_method_reference;public class Student implements Comparable<Student>{private String name;private int age;private char gender;private double height;//在Student類里寫一個靜態方法,用來通過身高比較public static int compareByHeight(Student o1, Student o2){return Double.compare(o1.getHeight(), o2.getHeight());}public Student() {}public Student(String name, int age, char gender, double height) {this.name = name;this.age = age;this.gender = gender;this.height = height;}// s1.compareTo(s2)// 比較者:s1 == this// 被比較者:s2 == o@Overridepublic int compareTo(Student o) {return this.age - o.age; // 升序}/*** 獲取* @return name*/public String getName() {return name;}/*** 設置* @param name*/public void setName(String name) {this.name = name;}/*** 獲取* @return age*/public int getAge() {return age;}/*** 設置* @param age*/public void setAge(int age) {this.age = age;}/*** 獲取* @return gender*/public char getGender() {return gender;}/*** 設置* @param gender*/public void setGender(char gender) {this.gender = gender;}/*** 獲取* @return height*/public double getHeight() {return height;}/*** 設置* @param height*/public void setHeight(double height) {this.height = height;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", gender=" + gender +", height=" + height +'}' + "\n";}}
import java.util.Arrays;public class Test1 {public static void main(String[] args) {// 目標:理解靜態方法引用。Student[] students = new Student[4]; // students = [null, null, null, null]students[0] = new Student("周芷若", 21, '女', 169.3);students[1] = new Student("殷素素", 38, '女', 172.2);students[2] = new Student("小昭", 19, '女', 168.5);students[3] = new Student("張無忌", 23, '男', 183.5);//        Arrays.sort(students, (o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight()));//完全夠用
//
//        Arrays.sort(students, (o1, o2) -> Student.compareByHeight(o1, o2));// 靜態方法引用。Arrays.sort(students, Student::compareByHeight); // 終極簡化代碼!System.out.println(Arrays.toString(students));}
}

3.2 實例方法引用

import java.util.Arrays;public class Test2 {public static void main(String[] args) {// 目標:理解實例方法引用。Student[] students = new Student[4]; // students = [null, null, null, null]students[0] = new Student("周芷若", 21, '女', 169.3);students[1] = new Student("殷素素", 38, '女', 172.2);students[2] = new Student("小昭", 19, '女', 168.5);students[3] = new Student("張無忌", 23, '男', 183.5);// Arrays.sort(students, (o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight()));//要先創建對象Test2 t = new Test2();// Arrays.sort(students, (o1, o2) -> t.compare(o1, o2));Arrays.sort(students, t::compare);//還可以更簡潔//Arrays.sort(students, new Test2()::compare);System.out.println(Arrays.toString(students));}//定義一個對象方法public int compare(Student o1, Student o2){return Double.compare(o1.getHeight(), o2.getHeight());}
}

3.3 特定類型方法的引用

import java.util.Arrays;
import java.util.Comparator;public class Test3 {public static void main(String[] args) {// 目標:特定類型的方法引用。String[] names = {"dlei", "Angela", "baby", "caocao", "Coach", "曹操" ,"deby", "eason", "andy"};// 對他們排序(默認按照首字母編號排序)// 拓展(忽略大小寫排序)
//        Arrays.sort(names, new Comparator<String>() {
//            @Override
//            public int compare(String o1, String o2) {
//                // o1  Angela
//                // o2  andy
//                return o1.compareToIgnoreCase(o2);
//            }
//        });
//
//        Arrays.sort(names, ( o1,  o2) -> o1.compareToIgnoreCase(o2));Arrays.sort(names, String::compareToIgnoreCase);System.out.println(Arrays.toString(names));}
}

3.4 構造器引用

public class Test4 {public static void main(String[] args) {// 目標:掌握構造器引用。
//        Create c1 = new Create() {
//            @Override
//            public Car createCar(String name) {
//                return new Car(name);
//            }
//        };// Create c1 = name -> new Car(name) ;Create c1 = Car::new;//硬造場景,實際上Car car = new Car("布加迪威龍");就可以了Car car = c1.createCar("布加迪威龍");System.out.println(car);}
}@FunctionalInterface // 函數式接口
interface Create{//用來創建一個Car對象,Car對象的名字是nameCar createCar(String name);
}//硬造場景,沒有意義,用來理解語法
//先定義一個Car類
class Car{private String name;public Car() {}public Car(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Car{" +"name='" + name + '\'' +'}';}
}

4.常見算法

4.1 冒泡

import java.util.Arrays;public class Demo1 {public static void main(String[] args) {// 目標:完成冒泡排序的代碼實現。// 1、定義一個數組int[] arr = {5, 2, 3, 1};//           0  1  2  3// 2、定義一個循環控制冒幾輪.for (int i = 0; i < arr.length - 1; i++) {//  輪數(i)    每輪的次數      j的占位//  第一輪0         3          0 1 2//  第二輪1         2          0 1//  第三輪2         1          0// 3、內部循環要控制每輪比較幾次for (int j = 0; j < arr.length - i - 1; j++) {// 4、判斷當前位置j是否大于其后一個位置處的數據,若較大,則交換。if(arr[j] > arr[j+1]){// 5、定義一個臨時變量記住后一個位置處的數據int temp = arr[j+1];// 6、把前一個位置處的數據賦值給后一個位置處arr[j+1] = arr[j];// 7、把后一個位置原來的數據賦值給前一個位置處arr[j] = temp;}}}System.out.println(Arrays.toString(arr));}
}

4.2 選擇排序

package com.itheima.d4_sf;import java.util.Arrays;public class Demo2 {public static void main(String[] args) {// 目標:實現選擇排序。// 1、定義一個數組int[] arr = {5, 1, 3, 2};//           0  1  2  3// 2、定義一個循環控制選擇幾輪。for (int i = 0; i < arr.length - 1; i++) {/**輪數(i) 次數    j的占位0        3     1  2  31        2     2  32        1     3*/// 3、內部循環控制選擇幾次。for (int j = i + 1; j < arr.length; j++) {// 4、判斷j對應位置處的數據是否小于當前i位置處的數據,若較小則交換。if(arr[i] > arr[j]) {int temp = arr[j];arr[j] = arr[i];arr[i] = temp;}}}System.out.println(Arrays.toString(arr));}
}

?這種寫法會造成數組頻繁的交換,性能不好,有沒有更優的寫法呢?

package com.itheima.d4_sf;import java.util.Arrays;public class Demo2_2 {public static void main(String[] args) {// 目標:實現選擇排序。// 1、定義一個數組int[] arr = {5, 1, 3, 2};//           0  1  2  3// 2、定義一個循環控制選擇幾輪。for (int i = 0; i < arr.length - 1; i++) {/**輪數(i) 次數    j的占位0        3     1  2  3但是1        2     2  32        1     3*/// 定義一個變量記住本輪最小值對應的索引int min = i;// 3、內部循環控制選擇幾次。for (int j = i + 1; j < arr.length; j++) {// 4、判斷j對應位置處的數據是否小于當前min位置處的數據,若較小則交換min為j值。//也就是找出索引i后面最小的數字與i進行交換,把最小的數字換到i的位置if(arr[j] < arr[min]) {min = j;}}//5.如果在本輪中找到了比當前索引i處更小的元素(即min != i),則交換這兩個元素。if(min != i){int temp = arr[i];arr[i] = arr[min];arr[min] = temp;}}System.out.println(Arrays.toString(arr));}
}

4.3 二分查找

package com.itheima.d4_sf;public class Demo3 {public static void main(String[] args) {// 目標:完成二分查找算法。int[] array = {7, 23, 79, 81, 103, 127, 131, 147};int index = searchDataIndex(array, 79);System.out.println("79的索引是:" + index);int index2 = searchDataIndex(array, 179);System.out.println("179的索引是:" + index2);}public static int searchDataIndex(int[] array, int number){// array = {7, 23, 79, 81, 103, 127, 131, 147}// 1、定義頭尾指針int left = 0;int right = array.length - 1;// 2、開始折半查詢。while (left <= right) {// 3、取中間索引int middle = (left + right) / 2;// 4、判斷當前要找的數據,與中間位置處的數據大小情況if(number > array[middle]) {// 5、往右邊找,左邊指針更新為 = 中間位置 + 1.left = middle + 1;}else if(number < array[middle]) {// 6、往左邊找,右邊指針更新為 = 中間位置-1right = middle - 1;}else {return middle;}}return -1;}
}

5.正則表達式

5.1 概述

5.2 正則表達式書寫規則

預定義字符(只能匹配單個字符) :? \d? \D?? \s? \S? \w? \W

在Java中,\是有特殊用途的,一般作為特殊字符使用不能獨立存在:\n 代表換行? ?\t 代表一個空格縮進
?所以在使用預定義字符時 \d 等需要再使用 \ 轉義

package com.itheima.d5_regex;/*** 目標:掌握正則表達式的書寫規則*/
public class RegexTest2 {public static void main(String[] args) {// 1、字符類(只能匹配單個字符)System.out.println("a".matches("[abc]"));    // [abc]只能匹配a、b、cSystem.out.println("e".matches("[abcd]")); // falseSystem.out.println("d".matches("[^abc]"));   // [^abc] 不能是abcSystem.out.println("a".matches("[^abc]"));  // falseSystem.out.println("b".matches("[a-zA-Z]")); // [a-zA-Z] 只能是a-z A-Z的字符System.out.println("2".matches("[a-zA-Z]")); // falseSystem.out.println("k".matches("[a-z&&[^bc]]")); // : a到z,除了b和cSystem.out.println("b".matches("[a-z&&[^bc]]")); // falseSystem.out.println("ab".matches("[a-zA-Z0-9]")); // false 注意:以上帶 [內容] 的規則都只能用于匹配單個字符// 2、預定義字符(只能匹配單個字符)  .  \d  \D   \s  \S  \w  \WSystem.out.println("徐".matches(".")); // .可以匹配任意字符System.out.println("徐徐".matches(".")); // false,因為只能匹配一個字符// 在Java中,\是有特殊用途的,一般作為特殊字符使用不能獨立存在:\n代表換行 \t代表一個空格縮進// \需要再使用\轉義System.out.println("2".matches("\\d")); // true \d:代表數字0-9  \D:代表非數字System.out.println("a".matches("\\d")); // falseSystem.out.println(" ".matches("\\s"));   // \s: 代表一個空白字符System.out.println("a".matches("\s")); // falseSystem.out.println("a".matches("\\S"));  // \S: 代表一個非空白字符System.out.println(" ".matches("\\S")); // falseSystem.out.println("a".matches("\\w"));  // \w: [a-zA-Z_0-9]System.out.println("_".matches("\\w")); // trueSystem.out.println("徐".matches("\\w")); // falseSystem.out.println("徐".matches("\\W"));  // [^\w]不能是a-zA-Z_0-9System.out.println("a".matches("\\W"));  // falseSystem.out.println("23232".matches("\\d")); // false 注意:以上預定義字符都只能匹配單個字符。// 3、數量詞: ?   *   +   {n}   {n, }  {n, m}System.out.println("a".matches("\\w?"));   // ? 代表0次或1次System.out.println("".matches("\\w?"));    // trueSystem.out.println("abc".matches("\\w?")); // falseSystem.out.println("abc12".matches("\\w*"));   // * 代表0次或多次System.out.println("".matches("\\w*"));        // trueSystem.out.println("abc12張".matches("\\w*")); // falseSystem.out.println("abc12".matches("\\w+"));   // + 代表1次或多次System.out.println("".matches("\\w+"));       // falseSystem.out.println("abc12張".matches("\\w+")); // falseSystem.out.println("a3c".matches("\\w{3}"));   // {3} 代表要正好是n次System.out.println("abcd".matches("\\w{3}"));  // falseSystem.out.println("abcd".matches("\\w{3,}"));     // {3,} 代表是>=3次System.out.println("ab".matches("\\w{3,}"));     // falseSystem.out.println("abcde徐".matches("\\w{3,}"));     // falseSystem.out.println("abc232d".matches("\\w{3,9}"));     // {3, 9} 代表是  大于等于3次,小于等于9次// 4、其他幾個常用的符號:(?i)忽略大小寫 、 或:| 、  分組:()System.out.println("----------------------------------------------------");System.out.println("abc".matches("(?i)abc")); // trueSystem.out.println("ABC".matches("(?i)abc")); // trueSystem.out.println("aBc".matches("a((?i)b)c")); // trueSystem.out.println("ABc".matches("a((?i)b)c")); // false// 需求1:要求要么是3個小寫字母,要么是3個數字。System.out.println("123".matches("(\\d{3})|([a-z]{3})"));//trueSystem.out.println("abc".matches("(\\d{3})|([a-z]{3})"));//trueSystem.out.println("ab1".matches("(\\d{3})|([a-z]{3})"));//false// 需求2:必須是”我愛“開頭,中間可以是至少一個”編程“,最后至少是1個”666“System.out.println("我愛編程編程666666".matches("我愛(編程)+(666)+"));//trueSystem.out.println("我愛編程編程6666666".matches("我愛(編程)+(666)+"));//false一定要3個666}
}

?5.3 正則表達式案例

需求:校驗用戶輸入的電話、郵箱、時間是否合法

shift + F6 給相同的名稱重新命名

package com.itheima.d5_regex;import java.util.Scanner;public class RegexTest3 {public static void main(String[] args) {// 目標:使用所學的正則表達式來校驗數據的合法性。//checkEmail();checkPhone();}public static void checkPhone(){while (true) {Scanner sc = new Scanner(System.in);System.out.println("請您輸入手機號碼:");String phone = sc.next();if(phone.matches("1[3-9]\\d{9}")) {System.out.println("手機號碼合法,錄入成功!");break;}else {System.out.println("您輸入的手機號碼有毛病!請重新輸入!");}}}public static void checkEmail(){while (true) {Scanner sc = new Scanner(System.in);System.out.println("請您輸入郵箱:");String email = sc.next();// dlei0009@163.com// 5423253@qq.com// xulei2@itcast.com.cnif(email.matches("\\w{2,30}@\\w{2,20}(\\.\\w{2,30}){1,2}")) {System.out.println("郵箱合法,錄入成功!");break;}else {System.out.println("您輸入的郵箱有毛病!請重新輸入!");}}}}

5.4 正則爬取內容

第一個案例:

package com.itheima.d5_regex;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class RegexTest4 {public static void main(String[] args) {// 目標:了解使用正則表達式去文本中爬取想要的信息。String data = "來黑馬程序員學習Java,\n" +"電話:18512516758,18512508907\n" +"或者聯系郵箱: boniu@itcast.cn\n" +"座機電話:01036517895,010-98951256\n" +"郵箱:bozai@itcast.cn,\n" +"郵箱2:dlei0009@163.com,\n" +"熱線電話:400-618-9090 ,400-618-4000,\n" +"4006184000,4006189090\n";// 需求:從中間爬取出郵箱 手機號碼 座機號碼 400號碼。// 1、定義爬取規則對象,封裝要爬取的格式。//這是官方規定的格式去編譯我們所寫的爬取規則,來得到一個爬取規則對象Pattern pattern = Pattern.compile("(\\w{2,30}@\\w{2,20}(\\.\\w{2,20}){1,2})|(1[3-9]\\d{9})" +"|(0\\d{2,6}-?[1-9]\\d{3,10})|(400-?[1-9]\\d{2,6}-?[1-9]\\d{2,6})");// 2、通過匹配規則對象pattern與內容data建立聯系得到一個匹配器對象//匹配器對象可以拿到匹配規則pattern去提供的數據data中爬取內容Matcher matcher = pattern.matcher(data);// 3、使用匹配器對象,開始爬取內容。//matcher.find()的返回值類型是boolean,如果返回為true就說明爬取到符合規則的內容while (matcher.find()){String info = matcher.group();System.out.println(info);}}
}

第二個案例:

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class RegexTest5 {public static void main(String[] args) {// 目標:了解使用正則表達式去文本中爬取想要的信息。(分組爬取)String data = "來黑馬程序員學習Java,\n" +"電話:18512516758,18512508907\n" +"或者聯系郵箱: boniu@itcast.cn\n" +"座機電話:01036517895,010-98951256\n" +"郵箱:bozai@itcast.cn,\n" +"郵箱2:dlei0009@163.com,\n" +"熱線電話:400-618-9090 ,400-618-4000,\n" +"4006184000,4006189090\n";// 1、指定爬取規則對象:設置匹配規則。//用分組爬取,把郵箱前面的部分括起來代表第一組Pattern p = Pattern.compile("(\\w{2,30})@\\w{2,20}(\\.\\w{2,20}){1,2}");// 2、讓內容和爬取規則建立關系,得到一個匹配器對象。Matcher matcher = p.matcher(data);// 3、開始使用匹配器對象,開始爬取內容while (matcher.find()) {// 把爬到的信息提取出來String rs = matcher.group(1); // 只要爬取出來的郵箱中的第一組括號的內容。System.out.println(rs);}}
}

?第三個案例:

?

package com.itheima.d5_regex;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class RegexTest6 {public static void main(String[] args) {// 目標:了解使用正則表達式去文本中爬取想要的信息。(了解)String data = "歡迎張全蛋光臨本系統!他刪庫并跑路歡迎李二狗子光臨本系統!" +" 歡迎馬六子光臨本系統!它瀏覽了很多好看的照片!歡迎夏洛光臨本系統!他在六點鐘送出了一個嘉年華!" ;// 1、指定爬取規則對象:設置匹配規則。//(.+)代表中間的名字可以是任意個
//         String regex1 = "歡迎(.+)光臨"; // 貪婪匹配! 最大范圍匹配:從第一個歡迎匹配到最后一個光臨String regex2 = "歡迎(.+?)光臨"; // 非貪婪匹配 最小范圍匹配(規定,也可以理解為?代表0或1次)Pattern p = Pattern.compile(regex2);// 2、讓內容和爬取規則建立關系,得到一個匹配器對象。Matcher matcher = p.matcher(data);// 3、開始使用匹配器對象,開始爬取內容while (matcher.find()) {// 把爬到的信息提取出來String rs = matcher.group(1); // 我只要爬取內容中的第一組()內容System.out.println(rs);}}
}

?組的編號規則:組號是按照左括號出現的順序來確定的,從1開始計數

特殊組號0:組號0代表的是整個正則表達式所匹配的內容,組0對應的就是“歡迎張全蛋光臨”這樣完整的內容

而組1也就是(.+?),他匹配的是兩個關鍵詞之間的任意字符,如“張全蛋”就是組1匹配的內容,會把所有滿足條件的內容都輸出

5.5 搜索、分割

import java.util.Arrays;/*** 目標:了解使用正則表達式做搜索替換,內容分割。*/
public class RegexTest7 {public static void main(String[] args) {// 1、public String replaceAll(String regex , String newStr):按照正則表達式匹配的內容進行替換// 需求1:請把 古力娜扎ai8888迪麗熱巴999aa5566馬爾扎哈fbbfsfs42425卡爾扎巴,中間的非中文字符替換成 “-”String s1 = "古力娜扎ai8888迪麗熱巴99fafas9aa5566馬爾扎哈fbbADFFfsfs42425卡爾扎巴";//\w+代表一次或多次英文字母,數字或下劃線String result = s1.replaceAll("\\w+", "-");System.out.println(result);// 2、public String[] split(String regex):按照正則表達式匹配的內容進行分割字符串,反回一個字符串數組。// 需求1:請把 古力娜扎ai8888迪麗熱巴999aa5566馬爾扎哈fbbfsfs42425卡爾扎巴,中的人名獲取出來。String[] names = s1.split("\\w+");for (int i = 0; i < names.length; i++) {System.out.println(names[i]);}}
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86705.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86705.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86705.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解PHP的命名空間

命名空間是PHP 5.3引入的一個特性&#xff0c;它的主要目的是解決在大型應用程序中可能出現的名稱沖突問題。在沒有命名空間的情況下&#xff0c;如果兩個不同的庫或模塊定義了相同名稱的函數或類&#xff0c;那么在使用這些庫或模塊的時候就會引發沖突。為了解決這個問題&…

SwiftUI學習筆記day5:Lecture 5 Stanford CS193p 2023

SwiftUI學習筆記day5:Lecture 5 Stanford CS193p 2023 課程鏈接&#xff1a;Lecture 5 Stanford CS193p 2023代碼倉庫&#xff1a;iOS課程大綱&#xff1a; Enum 定義&#xff1a;enum MyType { … }關聯值&#xff1a;case drink(name: String, oz: Int)匹配&#xff1a;switc…

idea 報錯:java: 非法字符: ‘\ufeff‘

idea 報錯&#xff1a;java: 非法字符: ‘\ufeff‘ 解決方案&#xff1a;

數據結構與算法之美:圖

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《題海拾貝》、《C修煉之路》 歡迎點贊&#xff0c;關注&am…

SpringBoot -- 熱部署

9.SpringBoot 熱部署&#xff08;自動重啟&#xff09; 在實際開發過程中&#xff0c;每次修改代碼就得將項目重啟&#xff0c;重新部署&#xff0c;對于一些大型應用來說&#xff0c;重啟時間需要花費大量的時間成本。對于一個后端開發者來說&#xff0c;重啟過程確實很難受啊…

HarmonyOS 5瀏覽器引擎對WebGL 2.0的支持如何?

以下是HarmonyOS 5瀏覽器引擎對?WebGL 2.0?支持的詳細技術分析&#xff1a; 一、核心支持能力 ?系統能力聲明 HarmonyOS 5 瀏覽器引擎通過 SystemCapability.Graphic.Graphic2D.WebGL2 提供對 WebGL 2.0 的底層支持 支持的關鍵特性包括&#xff1a; OpenGL ES 3.0 特性…

Class1線性回歸

Class1線性回歸 買房預測 要根據歷史數據來預測一套房子的價格。你發現影響房價的因素有很多&#xff0c;于是你決定使用線性回歸模型來預測房價。 影響房價的因素如下&#xff1a; 房屋面積&#xff08;平方米&#xff09; 房齡&#xff08;年&#xff09; 離地鐵站的距離&a…

Vue.js 3:重新定義前端開發的進化之路

Vue.js 3&#xff1a;重新定義前端開發的進化之路 引言&#xff1a;一場醞釀已久的革新 2020年9月18日&#xff0c;Vue.js團隊以代號"One Piece"正式發布3.0版本&#xff0c;這不僅是框架發展史上的重要里程碑&#xff0c;更是前端工程化領域的一次革命性突破。歷經…

Unity性能優化-渲染模塊(1)-CPU側(1)-優化方向

Unity 中渲染方面的優化大致可以劃分為以下幾塊核心內容&#xff1a; CPU 優化 (減少 Draw Calls 和 CPU 瓶頸) GPU 優化 (減少像素著色和 GPU 瓶頸) 內存和顯存優化 (Resource Management) 光照優化 (Lighting & Global Illumination) 這四個方面是相互關聯的。一個方…

AI矢量圖與視頻無痕修復:用Illustrator與After Effects解鎖創作新維度

最近因一個項目&#xff0c;有機會深度體驗了奧地利Blueskyy藝術學院授權的Adobe教育版全家桶&#xff0c;過程中發現了不少令人驚喜的“黑科技”&#xff0c;很想和大家分享這份發掘寶藏的喜悅。一句話總結這次體驗&#xff1a;慷慨且穩定。比如&#xff0c;它每周提供高達150…

Maven Javadoc 插件使用詳解

Maven Javadoc 插件使用詳解 maven-javadoc-plugin 是 Maven 項目中用于生成 Java API 文檔的標準插件&#xff0c;它封裝了 JDK 的 javadoc 工具&#xff0c;提供了更便捷的配置和集成方式。 一、基本使用 1. 快速生成 Javadoc 在項目根目錄執行以下命令&#xff1a; bas…

Apache Kafka 面試應答指南

Apache Kafka 核心知識詳解與面試應答指南 一、Apache Kafka 概述 Apache Kafka 作為一款分布式流處理框架,在實時構建流處理應用領域發揮著關鍵作用。其最廣為人知的核心功能,便是作為企業級消息引擎被眾多企業采用。 二、消費者組 (一)定義與原理 消費者組是 Kafka 獨…

在NVIDIA Jetson和RTX上運行Google DeepMind的Gemma 3N:多模態AI的邊緣計算革命

在NVIDIA Jetson和RTX上運行Google DeepMind的Gemma 3N&#xff1a;多模態AI的邊緣計算革命 文章目錄 在NVIDIA Jetson和RTX上運行Google DeepMind的Gemma 3N&#xff1a;多模態AI的邊緣計算革命引言&#xff1a;多模態AI進入邊緣計算時代文章結構概覽 第一章&#xff1a;Gemma…

iOS打包流程中的安全處理實踐:集成IPA混淆保護的自動化方案

隨著iOS應用上線節奏的加快&#xff0c;如何在持續集成&#xff08;CI&#xff09;或交付流程中嵌入安全處理手段&#xff0c;成為開發團隊構建自動化發布鏈路時不可忽視的一環。特別是在App已經完成構建打包&#xff0c;準備分發前這一階段&#xff0c;對IPA進行結構層面的加固…

FFmpeg進行簡單的視頻編輯與代碼寫法實例

使用 FFmpeg 進行簡單的視頻編輯非常強大。它是一個命令行工具&#xff0c;雖然一開始可能看起來有點復雜&#xff0c;但掌握了基本命令后會非常有用。 以下是一些常見的簡單視頻編輯操作及其 FFmpeg 命令&#xff1a; 1. 剪切視頻 如果你想從一個視頻中剪切出一段&#xff0…

如何使用免費軟件寫論文?六個免費論文生成軟件使用指南

在學術寫作中&#xff0c;利用AI技術和免費的寫作工具可以極大地提高效率&#xff0c;尤其對于需要處理大量文獻、結構化寫作的論文來說&#xff0c;使用合適的軟件能節省時間&#xff0c;提升論文質量。這里為您推薦六個免費的論文生成軟件&#xff0c;并提供使用指南&#xf…

大數據系統架構實踐(二):Hadoop集群部署

大數據系統架構實踐&#xff08;二&#xff09;&#xff1a;Hadoop集群部署 文章目錄 大數據系統架構實踐&#xff08;二&#xff09;&#xff1a;Hadoop集群部署一、Hadoop簡介二、部署前準備三、部署Hadoop集群1. 下載并解壓安裝包2. 配置hadoop-env.sh3. 配置core-site.xml4…

42道Maven高頻題整理(附答案背誦版)

1.簡述什么是Maven&#xff1f; Maven是一個項目管理和構建自動化工具&#xff0c;主要服務于Java項目。使用Maven&#xff0c;開發者可以方便地管理項目的構建、文檔生成、報告、依賴、SCM&#xff08;軟件配置管理&#xff09;、發布和分發等過程。 Maven的核心概念是基于項…

【數字后端】- 如何進行時鐘樹綜合?

首先&#xff0c;要明確的是&#xff0c;時鐘樹綜合只有命令去操作這一種方式 CTS的步驟 1、時鐘樹綜合前的準備工作-設置時鐘樹cell&#xff08;每個項目必做&#xff09; 最簡單的項目要設置生長時鐘樹時可用的clock buffer和clock inverter cell list&#xff0c;如下 此…

OpenCV CUDA模塊設備層-----像素值進行逐通道的最大值比較函數max()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 是 OpenCV 的 CUDA 模塊&#xff08;cv::cudev&#xff09; 中的一個 設備端內聯函數&#xff08;device function&#xff09;&#xff0c;用于…