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

正則表示式學習

正則表示式 就是為了查詢到制定的字串。 學習它沒有那麼難的,最簡單的表達方式就是 {在哪裡} {什麼字元} {匹配多少次}

一、定位符(在哪裡)

字元 描述
^ 匹配輸入字串開始的位置。如果設定了 RegExp 物件的 Multiline 屬性,^ 還會與 \n 或 \r 之後的位置匹配。
$ 匹配輸入字串結尾的位置。如果設定了 RegExp 物件的 Multiline 屬性,$ 還會與 \n 或 \r 之前的位置匹配。
\b 匹配一個單詞邊界,即字與空格間(這個描述不精準,測試看應該非單詞)的位置
\B 非單詞邊界匹配。

這裡的單詞特指二十六個英文字母的大小寫 開始的和結束很好理解

二.、字元(什麼字元)

普通字元 非列印字元 特殊字元(保留的一個{[之類),這裡我就飄過了~~~

一些轉移字元轉換後代表的特殊字元,就需自己練習和記憶下,沒什麼可說的。 比如 \w 代表 匹配字母、數字、下劃線。等價於’[A-Za-z0-9_]’ 需要注意的在組合過程有兩種方式 字元 | 或者 中括號[] 需要注意

  • x|y 代表匹配x或者Y
  • [xyz] 代表者匹配x 或者 y 或者 z其中的一個
  • [^xyz] 負值字元集合。匹配未包含的任意字元。
  • [a-z] 字元範圍。匹配指定範圍內的任意字元。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 範圍內的任意小寫字母字元。
  • [^a-z] 負值字元範圍。匹配任何不在指定範圍內的任意字元。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 範圍內的任意字元。

三、 量詞,限定符(匹配多少次)

  • {m,n}:m到n個 這個是最基本的,下面的都是它的簡寫
  • *:等價於{0,}任意多個
  • +:等價於{1,}一個到多個
  • :等價於{0,1}0或一個

貪婪匹配 : 正則表示式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。預設的都是貪婪匹配 非貪婪匹配:就是匹配到結果就好,就少的匹配字元。需要在量詞後面加上? ,比如 * 就是 *? 就只會匹配零次,如果是+?就只會匹配一次,如果{2,3}則只會匹配兩次

學會這三個,就可以基本使用了,哈哈下一段java的測試程式碼。

來來來,福利一波,你可以上原始字串,說要求,我來幫你完成匹配規則

下一節會降到組的概念。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegMain {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String source = "this---is a test abcd abcd ef";

        //測試開始限定符
        printReg(source, "t");
        printReg(source, "^t");
        //測試 單詞邊界 限定符
        printReg(source, "is");
        printReg(source, "is\\b");
        printReg(source, "i\\b");
        printReg(source, "\\bis\\b"); 
        //測試 非單詞邊界 限定符
        printReg(source, "\\Bis\\b"); 

        //測試量詞
        printReg(source, "^this-*"); 
        printReg(source, "^this-+"); 
        printReg(source, "^this-?"); 
        printReg(source, "^this-{2,3}"); 

        //測試量詞非貪婪的匹配
        printReg(source, "^this-*?"); 
        printReg(source, "^this-+?"); 
        printReg(source, "^this-??"); 
        printReg(source, "^this-{2,3}?"); 
    }

    private static void printReg(String source, String pattern) {
        System.out.println("source text: \" " + source + "\" parttern: \"" + pattern + "\"");
        // 建立 Pattern 物件
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(source);
        while (m.find()) {
            int groupCount = m.groupCount();
            for (int i = 0; i < groupCount + 1; i++) {
                System.out.println("group: " + i + " ----> " + m.group(i));
            }
        }
        System.out.println(" \r\n --------------\r\n ");
    }

}