1. 程式人生 > 實用技巧 >JAVA筆記整理-正則表示式與列舉

JAVA筆記整理-正則表示式與列舉

正則表示式

1、正則表示式定義

​ 正則表示式(Regular Expression)由字母和符號組成的具有特定意義的公式,用於匹配或檢索符合條件的字串。

​ 例如 在網頁上輸入使用者名稱,要求使用者名稱必須由數字,字母,下劃線,或者長度必須8-16位之間 像這樣的滿足條件的公式,都是編寫的 正則表示式進行驗證。

^[a-zA-Z0-9_]{8,16}$

解釋: ^ :表示以指定的字元開頭

      $:以指定符合結尾

[ a-zA-Z]: 字元必須是這個a-z或 A-Z之間的一個字元

​ {8,16}:匹配前面的字元8次到16次之間

正則表示式不屬於某一門程式語言,可以在很多語言中使用, 例如 Java ,Python 、JS、MySql

Java提供對正則表示式的支援,有如下類

a、java.util.regex.Pattern 正則表示式的編譯器類

b、java.util.regex.Matcher 正則表示式的匹配器

c、java.lang.String 中的方法自動相容 正則語法

1、 元字元

元字元是組成正則表示式的最基本的符號 ,通常代表一定意義

元字元 解釋
. 匹配任意一個字元
\w 匹配一個數字,字母,_ 或漢字 \W :對\w取反
\d 匹配一個數字 \D:對\d取反
\s 匹配一個空白字元 \S:對\s取反
\b 匹配以什麼字元開頭
^ 以指定的字串開頭 ,用於正則開始的標誌位
$ 以指定的字串結尾,用於正則結束的標誌位
  1. 匹配以abc開頭的字串
   ^abc  或者  \babc

2、匹配8位數的QQ號碼

^\d\d\d\d\d\d\d\d$  或  ^\d{8}$

3、匹配以1開頭的手機號

^1\d\d\d\d\d\d\d\d\d\d$
 String s ="abc";
        System.out.println(s.matches("abc"));
        System.out.println(s.matches("^abc"));
        s="6";
        System.out.println(s.matches("\\d"));
        s="123456780";
        System.out.println(s.matches("\\d{8}"));

區間段

   //[x] :表示匹配一個字元
        //[abc]:表示匹配a或b或c 一個字元
        System.out.println("a".matches("[abc]"));
        System.out.println("b".matches("[abc]"));
        //[^abc]:匹配不是 a 或b 或c
        System.out.println("b".matches("[^abc]"));
        // [0-9]:匹配任意一個數字
        System.out.println("4".matches("[0-9]"));

重複限定符

正則表示式中用於匹配重複次數的符號

重複限定符 意義
* 匹配前一個字元0次或多次
匹配前一個字元0次或1次
+ 匹配前一個字元1次或多次
{n} 匹配前一個字元n次
{n,} 匹配前一個字元至少n次
{n,m} 匹配前一個字元n到m次(包含n次,m次)

轉義

如果要匹配的字串中本身就包含小括號,那是不是衝突?應該怎麼辦?
針對這種情況,正則提供了轉義的方式,也就是要把這些元字元、限定符或者關鍵字轉義成普通的字元,做法很簡 答,就是在要轉義的字元前面加個斜槓,也就是\即可。 如:要匹配以(ab)開頭:

或條件

回到我們剛才的手機號匹配,我們都知道:國內號碼都來自三大網,它們都有屬於自己的號段,比如聯通有 130/131/132/155/156等號段,假如讓我們匹配一個聯通的號碼,那按照我們目前所學到的正 則,應該無從下手的,因為這裡包含了一些並列的條件,也就是“或”,那麼在正則中是如何表示“或”的呢? 正則用符號 | 來表示或,也叫做分支條件,當滿足正則裡的分支條件的任何一種條件時,都會當成是匹配成 功。
那麼我們就可以用或條件來處理這個問題

 // 建立匹配格式的編譯器
        String phone ="13388880000";
        Pattern pattern = Pattern.compile("1[356789][0-9]{9}");
        //  根據編譯器獲取匹配器
        Matcher matcher = pattern.matcher(phone);
        System.out.println("是否匹配目標字串:"+matcher.matches());

        // 或者簡寫  匹配年齡 (0-100   01-09 | 10-99 |100)
       boolean flag =  Pattern.matches
               ("(0?[0-9])|([1-9][0-9])|(100)","10");

        System.out.println(flag);

        // 匹配一個特殊字元
        // 匹配一個字串中是否包含 .
        String s2 ="adb";
        System.out.println(s2.matches(".*b.*"));
        // 因為.表示的所有字元  當匹配.時,需要轉義
        System.out.println(s2.matches(".*\\..*"));

        // 對於特殊符號 需要轉義   \\
        // 匹配郵箱   包含  任意字元任意個數@域名.com
        //    .cn  .com.cn  .gov  .net
        String email="[email protected]";
        System.out.println(email.matches("\\w+@\\w+(\\.[a-z]{2,3}){1,2}"));

        // 匹配一級網址 http://    https://d
        String url="http://www.baidu.com";
        System.out.println(url.matches("https?://www\\.\\w+\\.[a-z]{2,3}"));

        // 匹配生日格式   1900-13-01  ~ 2099-12-31   01  -31
        String birthday="1998-13-10"; // yyyy-MM-dd
        String regexp="((19)|(20))[0-9]{2}-((0[0-9])|(1[0-2]))-((0[1-9])|([1-2][0-9])|(3[0-1]))";
        System.out.println(birthday.matches(regexp));

匹配漢字

   // 匹配漢字
        String uname ="張";
        System.out.println(uname.matches("[\\u4E00-\\u9FFF]+"));


列舉類(enum)

1、列舉型別的誕生

​ 在JDK5以前,定義常量需要使用public fiinal static.. 單獨定義,如果有一組常量,需要定義一組final修飾的型別。這樣會很繁瑣,JDK5以後推出列舉型別。 可以將一組常量定義一個自定義類,使用是通過該型別直接方法。

2、 列舉型別的語法

  public  enum 列舉型別名稱{
      值1,值2,值3...
  }
  訪問時: 列舉型別名稱.值1 

用法1:

public enum Color {
    RED(),YELLOW(),BLUE();

}
 public static boolean isRedColor(Color color){
        if(color.equals(Color.RED)){
            return true;
        }
        return false;
    }
    
 public static void main(String[] args) {
        System.out.println(isRedColor(Color.BLUE));
        System.out.println(isRedColor(Color.RED));
}

用法2: 定義列舉類的屬性 並賦值

public enum PROVINCES {
    //列舉的值  在初始化列舉值時,通過構造器給它的屬性賦值
    HB("湖北",0),BJ("北京",1),HN("湖南",2),FJ("福建",3);

    //列舉的屬性
    private String provinceName;
    private int index;
    //列舉的構造器
    private PROVINCES(String provinceName,int index){
        this.provinceName= provinceName;
        this.index = index;
    }

    public String getProvinceName() {
        return provinceName;
    }

    public void setProvinceName(String provinceName) {
        this.provinceName = provinceName;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }
}

public class Test1 {
    public static void main(String[] args) {
        System.out.println(isRedColor(Color.BLUE));
        System.out.println(isRedColor(Color.RED));
//輸出某一列舉的值 name和 index
        System.out.println(PROVINCES.BJ.getProvinceName());
        System.out.println(PROVINCES.BJ.getIndex());

        //遍歷所有的列舉的值
         PROVINCES [] provs = PROVINCES.values();
        for(PROVINCES pro :  provs){
            System.out.println(pro.getIndex()+"---"+pro.getProvinceName());
        }