1. 程式人生 > >正則表示式的學習和練習

正則表示式的學習和練習

正則表示式通常被用來檢索、替換那些符合某個模式(規則)的文字。是用正則表示式來完成郵箱,賬號的驗證可以省去繁雜的邏輯,用更少的程式碼完成更復雜的事務。
通過學習我大致把當前學習的常見的字元分為四種:

1,預定義字元類

  • .:任何字元
  • \d : 數字[0-9]
  • \D:非數字[^0-9]
  • \s : 空白字元[\t\n\xOB\f\r]
  • \S : 非空白字元[^\s]
  • \w : 單詞字元[a-zA-Z_0-9]
  • \W : 非單詞字元[^\w]

2,數量詞

  • X? X,一次或一次也沒有;
  • X* X,零次或多次;
  • X+ X,一次或多次;
  • X{n} X,恰好n次;
  • X{n,} X,至少n次;
  • X{n,m} X,至少n次,不超過m次;

3,表示邏輯運算的詞

正則表示式中的邏輯運算的詞和java中邏輯運算子基本相同,除了邏輯非在正則表示式中是使用 ^ 表示

4,三個括號的使用

  1. [ ]方括號中一般放預定義字元類,多個字元之間用預設邏輯或連線。
    例如:
    [abc] 表示a或b或c
    [A-Za-z_0-9] 表示單詞字元
  2. { }花括號表示數量詞
  3. ( )圓括號表示捕獲組,圓括號中的內容作為一組來被識別
    例如:
    (abc) 表示abc
    在圓括號中可以使用邏輯符號連線
    例如:
    (abc|def)表示abc或def

感覺把正則表示式大致的分為這三個類會更好理解,記憶,學習以及使用

在API文件Pattern類下提供的正則表示式的典型呼叫方法是

在API文件Pattern類下提供的正則表示式的典型呼叫方法是

Pattern p = Pattern.compile("a*b");
 Matcher m = p.matcher("aaaaab");
 boolean b = m.matches();

平時使用時可以直接呼叫String類下的matchs()方法

matches
public boolean matches(String regex)告知此字串是否匹配給定的正則表示式。
呼叫此方法的 str.matches(regex) 形式與以下表達式產生的結果完全相同:

Pattern.matches(regex, str)

引數:
regex - 用來匹配此字串的正則表示式
返回:
當且僅當此字串匹配給定的正則表示式時,返回 true
丟擲:
PatternSyntaxException - 如果正則表示式的語法無效
從以下版本開始:
1.4
另請參見:
Pattern

正則表示式的常見應用

  1. 用正則表示式驗證郵箱賬號
/**
* 郵箱驗證
*6-18位任意單詞字元[email protected]+2-6位任意單詞字元+一位或多位.+任意單詞字元
*/
public static void test1(String str2) {
        String str="\\w{6,18}@\\w{2,6}(\\.\\w)+";
        //Scanner sc=new Scanner(System.in);
        System.out.println("請輸入郵箱");
        //String str2=sc.next();
        System.out.println("str2.matches(str)     "+str2.matches(str));
    }

2 .正則表示式完成切割指定字元的功能

/**
 * 
 * 切割 字串中的逗號
 */
    public static void test2() {

        String numbers="1,2,3,4,5,6,7,8,9,0";
        String regex=",";
        String [] str=numbers.split(regex);
        for(int i=0;i<str.length;i++) {
            System.out.println(str[i]);
        }

    }

3 . 正則表示式玩成替換指定字元的功能

/**
 * 
 *  替換字串中的單詞字母
 */
    public static void testReplace() {
        String str="aaaa1ahnvuhfewoi11384209e7439fsdhfdohd8892489";
        String regex="[a-zA-Z]";
        String str2=str.replaceAll(regex, "");
        System.out.println(str2);
        //輸出   11138420974398892489
    }

4 . 匹配並取出指定的字串

    /**
     * 
     * 
     * 取出指定的字串
     */
    public static void testBoundary() {
        // 定義字串
        String s = "abc 1234 efg a d,e hhh aa";

        // 規則 單詞邊界+三位任意字元+單詞邊界
        String regex = "\\b\\w{3}\\b";

        // 把規則編譯成模式物件
        Pattern p = Pattern.compile(regex);
        // 通過模式物件得到匹配器物件
        Matcher m = p.matcher(s);
        // 呼叫匹配器物件的功能
        // 通過find方法就是查詢有沒有滿足條件的子串

        //第一步,找到 find()
        while (m.find()) {
            //第二步 ,把找到的東西拿出來  group
            String string = m.group();
            System.out.println(string);
            //輸出abc efg hhh
        }


    }

5.正則表示式的分組功能

/**
 * 
 * 分組
 * (..)表示兩位任意字元(...)表示三位任意字元1+表示第一個()的內容重複
 * 一次或者多次
 */
    public static void testRegexGroup() {
        String regex="(..)(...)\\1+";
        System.out.println("高興高高興高興高興高興高興".matches(regex));
        //輸出true
        System.out.println("快快樂樂".matches(regex));
        //輸出false   
    }