正則表示式

摘要:正則表示式

ref:http://rich0423.blogspot.tw/2012/12/java-regular-expression.html

例如一些常用的範圍,我們可以使用預先定義的字元類別: 

.

符合任一字元

\d

等於 [0-9] 數字

\D

等於 [^0-9] 非數字

\s

等於 [ \t\n\x0B\f\r] 空白字元

\S

等於 [^ \t\n\x0B\f\r] 非空白字元

\w

等於 [a-zA-Z_0-9] 數字或是英文字

\W

等於 [^a-zA-Z_0-9] 非數字與英文字









.符合任一字元。例如有一字串abcdebcadxbc,使用.bc來比對的話,符合的子字串有abc、ebc、xbc三個;如果使用..cd,則符合的子字串只有bcd。

以上的例子來根據字元比對,您也可以使用「字元類」(Character class)來比較一組字元範圍,例如: 

[abc]

a、b或c

[^abc]

非a、b、c的其它字元

[a-zA-Z]

a到z或A到Z(範圍)

[a-d[m-p]]

a到d或m到p(聯集)

[a-z&&[def]]

d、e或f(交集)

[a-z&&[^bc]]

a到z,除了b與c之外(減集)

[a-z&&[^m-p]]

a到z且沒有m到p(a-lq-z)(減集)











一次只指定一個字元不過癮,也可以用Greedy quantifiers來指定字元可能出現的次數: 
 

X?

X出現一次或完全沒有

X*

X出現零次或多次

X+

X出現一次或多次

X{n}

X出現n

X{n,}

X出現至少n

X{n,m}

X出現至少n次,但不超過m









另外還有Reluctant quantifiers、Possessive quantifiers等的指定,您可以自行參考 java.util.regex.Pattern 類別中的說明。
在String類別中,matches()方法可以讓您驗證字串是否符合指定的正規表示式,這通常用於驗證使用者輸入的字串資料是否正確,例如電話號碼格式;replaceAll()方法可以將符合正規表示式的子字串置換為指定的字串;split()方法可以讓您依指定的正規表示式,將符合的子字串分離出來,並以字串陣列傳回。 


下面這個程式示範幾個正則表示式的應用: 

•     UseRegularExpression.java

import java.util.Scanner;

public class UseRegularExpression {

    public static void main(String args[]) {

        Scanner scanner = new Scanner(System.in);

         String str = "abcdefgabcabc";

        System.out.println(str.replaceAll(".bc", "###"));

         System.out.print("輸入手機號碼: ");

        str = scanner.next();

 

        // 簡單格式驗證

        if(str.matches("[0-9]{4}-[0-9]{6}"))

            System.out.println("格式正確");

        else

            System.out.println("格式錯誤");

 

        System.out.print("輸入href標籤: ");

        // Scanner的next()方法是以空白為區隔

        // 我們的輸入有空白,所以要執行兩次

        str = scanner.next() + " " + scanner.next();

 

        // 驗證href標籤

        if(str.matches("<a.+href*=*['\"]?.*?['\"]?.*?>"))

            System.out.println("格式正確");

        else

            System.out.println("格式錯誤");

 

        System.out.print("輸入電子郵件: ");

        str = scanner.next();

 

        // 驗證電子郵件格式

        if(str.matches(

        "^[_a-z0-9-]+([.][_a-z0-9-]+)*@[a-z0-9-]+([.][a-z0-9-]+)*$"))

            System.out.println("格式正確");

        else

            System.out.println("格式錯誤");

    }

}
執行結果:

###defg######
輸入手機號碼: 0988-100432
格式正確
輸入href標籤: <a href="http://caterpillar.onlyfun.net">
格式正確
輸入電子郵件: justin@caterpillar.onlyfun.net
格式正確


最後兩個href標籤與email驗證例子是很常見的正規表示式應用,以下為對應表

資料來源:張智星的網站 – 正規表示式

 

正規表示式

說明及範例

比對不成立之字串

/a/

含字母 “a” 的字串,例如 “ab”, “bac”, “cba”

“xyz”

/a./

含字母 “a” 以及其後任一個字元的字串,例如 “ab”, “bac”(若要比對.,請使用 \.)

“a”, “ba”

/^xy/

以 “xy” 開始的字串,例如 “xyz”, “xyab”(若要比對 ^,請使用 \^)

“axy”, “bxy”

/xy$/

以 “xy” 結尾的字串,例如 “axy”, “abxy”以 “xy” 結尾的字串,例如 “axy”, “abxy” (若要比對 $,請使用 \$)

“xya”, “xyb”

[13579]

包含 “1″ 或 “3″ 或 “5″ 或 “7″ 或 “9″ 的字串,例如:”a3b”, “1xy”

“y2k”

[0-9]

含數字之字串

不含數字之字串

[a-z0-9]

含數字或小寫字母之字串

不含數字及小寫字母之字串

[a-zA-Z0-9]

含數字或字母之字串

不含數字及字母之字串

b[aeiou]t

“bat”, “bet”, “bit”, “bot”, “but”

“bxt”, “bzt”

[^0-9]

不含數字之字串(若要比對 ^,請使用 \^)

含數字之字串

[^aeiouAEIOU]

不含母音之字串(若要比對 ^,請使用 \^)

含母音之字串

[^\^]

不含 “^” 之字串,例如 “xyz”, “abc”

“xy^”, “a^bc”

.

正規表示式的特定字元

說明

等效的正規表示式

\d

數字

[0-9]

\D

非數字

[^0-9]

\w

數字、字母、底線

[a-zA-Z0-9_]

\W

非 \w

[^a-zA-Z0-9_]

\s

空白字元

[ \r\t\n\f]

\S

非空白字元

[^ \r\t\n\f]

.

正規表示式

說明

/a?/

零或一個 a(若要比對? 字元,請使用 \?)

/a+/

一或多個 a(若要比對+ 字元,請使用 \+)

/a*/

零或多個 a(若要比對* 字元,請使用 \*)

/a{4}/

四個 a

/a{5,10}/

五至十個 a

/a{5,}/

至少五個 a

/a{,3}/

至多三個 a

/a.{5}b/

a 和 b中間夾五個(非換行)字元

.

字元

說明

簡單範例

\

避開特殊字元

/A\*/ 可用於比對 “A*”,其中 * 是一個特殊字元,為避開其特殊意義,所以必須加上 “\”

^

比對輸入列的啟始位置

/^A/ 可比對 “Abcd” 中的 “A”,但不可比對 “aAb”

$

比對輸入列的結束位置

/A$/ 可比對 “bcdA” 中的 “A”,但不可比對 “aAb”

*

比對前一個字元零次或更多次

/bo*/ 可比對 “Good boook” 中的 “booo”,亦可比對 “Good bk” 中的 “b”

+

比對前一個字元一次或更多次,等效於 {1,}

/a+/ 可比對 “caaandy” 中的 “aaa”,但不可比對 “cndy”

?

比對前一個字元零次或一次

/e?l/ 可比對 “angel” 中的 “el”,也可以比對 “angle” 中的 “l”

.

比對任何一個字元(但換行符號不算)

/.n/ 可比對 “nay, an apple is on the tree” 中的 “an” 和 “on”,但不可比對 “nay”

(x)

比對 x 並將符合的部分存入一個變數

/(a*) and (b*)/ 可比對 “aaa and bb” 中的 “aaa” 和 “bb”,並將這兩個比對得到的字串設定至變數 RegExp.$1 和 RegExp.$2。

xy

比對 x 或 y

/a*b*/g 可比對 “aaa and bb” 中的 “aaa” 和 “bb”

{n}

比對前一個字元 n 次,n 為一個正整數

/a{3}/ 可比對 “lllaaalaa” 其中的 “aaa”,但不可比對 “aa”

{n,}

比對前一個字元至少 n 次,n 為一個正整數

/a{3,}/ 可比對 “aa aaa aaaa” 其中的 “aaa” 及 “aaaa”,但不可比對 “aa”

{n,m}

比對前一個字元至少 n 次,至多 m 次,m、n 均為正整數

/a{3,4}/ 可比對 “aa aaa aaaa aaaaa” 其中的 “aaa” 及 “aaaa”,但不可比對 “aa” 及 “aaaaa”

[xyz]

比對中括弧內的任一個字元

/[ecm]/ 可比對 “welcome” 中的 “e” 或 “c” 或 “m”

[^xyz]

比對不在中括弧內出現的任一個字元

/[^ecm]/ 可比對 “welcome” 中的 “w”、”l”、”o”,可見出其與 [xyz] 功能相反。(同時請注意 /^/ 與 [^] 之間功能的不同。)

[\b]

比對退位字元(Backspace character)

可以比對一個 backspace ,也請注意 [\b] 與 \b 之間的差別

\b

比對英文字的邊界,例如空格

例如 /\bn\w/ 可以比對 “noonday” 中的 ‘no’ ;
/\wy\b/ 可比對 “possibly yesterday.” 中的 ‘ly’

\B

比對非「英文字的邊界」

例如, /\w\Bn/ 可以比對 “noonday” 中的 ‘on’ ,
另外 /y\B\w/ 可以比對 “possibly yesterday.” 中的 ‘ye’

\cX

比對控制字元(Control character),其中 X 是一個控制字元

/\cM/ 可以比對 一個字串中的 control-M

\d

比對任一個數字,等效於 [0-9]

/[\d]/ 可比對 由 “0″ 至 “9″ 的任一數字 但其餘如字母等就不可比對

\D

比對任一個非數字,等效於 [^0-9]

/[\D]/ 可比對 “w” “a”… 但不可比對如 “7″ “1″ 等數字

\f

比對 form-feed

若是在文字中有發生 “換頁” 的行為 則可以比對成功

\n

比對換行符號

若是在文字中有發生 “換行” 的行為 則可以比對成功

\r

比對 carriage return

 

\s

比對任一個空白字元(White space character),等效於 [ \f\n\r\t\v]

/\s\w*/ 可比對 “A b” 中的 “b”

\S

比對任一個非空白字元,等效於 [^ \f\n\r\t\v]

/\S/\w* 可比對 “A b” 中的 “A”

\t

比對定位字元(Tab)

 

\v

比對垂直定位字元(Vertical tab)

 

\w

比對數字字母字元(Alphanumerical characters)或底線字母(”_”),等效於 [A-Za-z0-9_]

/\w/ 可比對 “.A _!9″ 中的 “A”、”_”、”9″。

\W

比對非「數字字母字元或底線字母」,等效於 [^A-Za-z0-9_]

/\W/ 可比對 “.A _!9″ 中的 “.”、” “、”!”,可見其功能與 /\w/ 恰好相反。

\ooctal

比對八進位,其中octal是八進位數目

/\oocetal123/ 可比對 與 八進位的ASCII中 “123″ 所相對應的字元值。

\xhex

比對十六進位,其中hex是十六進位數目

/\xhex38/ 可比對 與 16進位的ASCII中 “38″ 所相對應的字元。