天天看點

正則文法及常用正則,Java學習者一定要掌握喲

      正則在Java的開發中有着很重要的地位,包括JavaScript也都是支援正則的,正則實際上最早是PHP上的一種發展産物,在JDK 1.4之前如果要想使用正則,則需要單獨進行開發包的配置,在JDK 1.4之後,程式中增加了對正則的支援。

關于正則的使用視訊,詳見《跟我學Java26日通》第12天的課程,Java常用類庫

正規表達式文法

在典型的搜尋和替換操作中,必須提供要查找的确切文字。這種技術對于靜态文本中的簡單搜尋和替換任務可能足夠了,但是由于它缺乏靈活性,是以在搜尋動态文本時就有困難了,甚至是不可能的。

使用正規表達式,就可以:

  • 測試字元串的某個模式。例如,可以對一個輸入字元串進行測試,看在該字元串是否存在一個電話号碼模式或一個信用卡号碼模式。這稱為資料有效性驗證。
  • 替換文本。可以在文檔中使用一個正規表達式來辨別特定文字,然後可以全部将其删除,或者替換為别的文字。
  • 根據模式比對從字元串中提取一個子字元串。可以用來在文本或輸入字段中查找特定文字。

例如,如果需要搜尋整個 web 站點來删除某些過時的材料并替換某些HTML 格式化标記,則可以使用正規表達式對每個檔案進行測試,看在該檔案中是否存在所要查找的材料或 HTML 格式化标記。用這個方法,就可以将受影響的檔案範圍縮小到包含要删除或更改的材料的那些檔案。然後可以使用正規表達式來删除過時的材料,最後,可以再次使用正規表達式來查找并替換那些需要替換的标記。

另一個說明正規表達式非常有用的示例是一種其字元串處理能力還不為人所知的語言。VBScript 是 Visual Basic 的一個子集,具有豐富的字元串處理功能。與 C 類似的 Jscript 則沒有這一能力。正規表達式給 JScript 的字元串處理能力帶來了明顯改善。不過,可能還是在 VBScript 中使用正規表達式的效率更高,它允許在單個表達式中執行多個字元串操作。

一個正規表達式就是由普通字元(例如字元 a 到 z)以及特殊字元(稱為元字元)組成的文字模式。該模式描述在查找文字主體時待比對的一個或多個字元串。正規表達式作為一個模闆,将某個字元模式與所搜尋的字元串進行比對。

這裡有一些可能會遇到的正規表達式示例:

JScript VBScript 比對
/^\[ \t]*$/ "^\[ \t]*$" 比對一個空白行。
/\d{2}-\d{5}/ "\d{2}-\d{5}" 驗證一個ID 号碼是否由一個2位數字,一個連字元以及一個5位數字組成。
/<(.*)>.*<\/\1>/ "<(.*)>.*<\/\1>" 比對一個 HTML 标記。
下表是元字元及其在正規表達式上下文中的行為的一個完整清單:
字元 描述
\ 将下一個字元标記為一個特殊字元、或一個原義字元、或一個 後向引用、或一個八進制轉義符。例如,'n' 比對字元 "n"。'\n' 比對一個換行符。序列 '\\' 比對 "\" 而 "\(" 則比對 "("。
^ 比對輸入字元串的開始位置。如果設定了 RegExp 對象的 Multiline 屬性,^ 也比對 '\n' 或 '\r' 之後的位置。
$ 比對輸入字元串的結束位置。如果設定了RegExp 對象的 Multiline 屬性,$ 也比對 '\n' 或 '\r' 之前的位置。
* 比對前面的子表達式零次或多次。例如,zo* 能比對 "z" 以及 "zoo"。 * 等價于{0,}。
+ 比對前面的子表達式一次或多次。例如,'zo+' 能比對 "zo" 以及 "zoo",但不能比對 "z"。+ 等價于 {1,}。
? 比對前面的子表達式零次或一次。例如,"do(es)?" 可以比對 "do" 或 "does" 中的"do" 。? 等價于 {0,1}。
{n} n 是一個非負整數。比對确定的 n 次。例如,'o{2}' 不能比對 "Bob" 中的 'o',但是能比對 "food" 中的兩個 o。
{n,} n 是一個非負整數。至少比對n 次。例如,'o{2,}' 不能比對 "Bob" 中的 'o',但能比對 "foooood" 中的所有 o。'o{1,}' 等價于 'o+'。'o{0,}' 則等價于 'o*'。
{n,m} m 和 n 均為非負整數,其中n <= m。最少比對 n 次且最多比對 m 次。劉, "o{1,3}" 将比對 "fooooood" 中的前三個 o。'o{0,1}' 等價于 'o?'。請注意在逗号和兩個數之間不能有空格。
當該字元緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 後面時,比對模式是非貪婪的。非貪婪模式盡可能少的比對所搜尋的字元串,而預設的貪婪模式則盡可能多的比對所搜尋的字元串。例如,對于字元串 "oooo",'o+?' 将比對單個 "o",而 'o+' 将比對所有 'o'。
. 比對除 "\n" 之外的任何單個字元。要比對包括 '\n' 在内的任何字元,請使用象 '[.\n]' 的模式。
(pattern) 比對pattern 并擷取這一比對。所擷取的比對可以從産生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中則使用 $0…$9 屬性。要比對圓括号字元,請使用 '\(' 或 '\)'。
(?:pattern) 比對 pattern 但不擷取比對結果,也就是說這是一個非擷取比對,不進行存儲供以後使用。這在使用 "或" 字元 (|) 來組合一個模式的各個部分是很有用。例如, 'industr(?:y|ies) 就是一個比 'industry|industries' 更簡略的表達式。
(?=pattern) 正向預查,在任何比對 pattern 的字元串開始處比對查找字元串。這是一個非擷取比對,也就是說,該比對不需要擷取供以後使用。例如, 'Windows (?=95|98|NT|2000)' 能比對 "Windows 2000" 中的 "Windows" ,但不能比對 "Windows 3.1" 中的 "Windows"。預查不消耗字元,也就是說,在一個比對發生後,在最後一次比對之後立即開始下一次比對的搜尋,而不是從包含預查的字元之後開始。
(?!pattern) 負向預查,在任何不比對Negative lookahead matches the search string at any point where a string not matching pattern 的字元串開始處比對查找字元串。這是一個非擷取比對,也就是說,該比對不需要擷取供以後使用。例如'Windows (?!95|98|NT|2000)' 能比對 "Windows 3.1" 中的 "Windows",但不能比對 "Windows 2000" 中的 "Windows"。預查不消耗字元,也就是說,在一個比對發生後,在最後一次比對之後立即開始下一次比對的搜尋,而不是從包含預查的字元之後開始
x|y 比對 x 或 y。例如,'z|food' 能比對 "z" 或 "food"。'(z|f)ood' 則比對 "zood" 或 "food"。
[xyz] 字元集合。比對所包含的任意一個字元。例如, '[abc]' 可以比對 "plain" 中的 'a'。
[^xyz] 負值字元集合。比對未包含的任意字元。例如, '[^abc]' 可以比對 "plain" 中的'p'。
[a-z] 字元範圍。比對指定範圍内的任意字元。例如,'[a-z]' 可以比對 'a' 到 'z' 範圍内的任意小寫字母字元。
[^a-z] 負值字元範圍。比對任何不在指定範圍内的任意字元。例如,'[^a-z]' 可以比對任何不在 'a' 到 'z' 範圍内的任意字元。
\b 比對一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以比對"never" 中的 'er',但不能比對 "verb" 中的 'er'。
\B 比對非單詞邊界。'er\B' 能比對 "verb" 中的 'er',但不能比對 "never" 中的 'er'。
\cx 比對由x指明的控制字元。例如, \cM 比對一個 Control-M 或回車符。 x 的值必須為 A-Z 或 a-z 之一。否則,将 c 視為一個原義的 'c' 字元。
\d 比對一個數字字元。等價于 [0-9]。
\D 比對一個非數字字元。等價于 [^0-9]。
\f 比對一個換頁符。等價于 \x0c 和 \cL。
\n 比對一個換行符。等價于 \x0a 和 \cJ。
\r 比對一個回車符。等價于 \x0d 和 \cM。
\s 比對任何空白字元,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。
\S 比對任何非空白字元。等價于 [^ \f\n\r\t\v]。
\t 比對一個制表符。等價于 \x09 和 \cI。
\v 比對一個垂直制表符。等價于 \x0b 和 \cK。
\w 比對包括下劃線的任何單詞字元。等價于'[A-Za-z0-9_]'。
\W 比對任何非單詞字元。等價于 '[^A-Za-z0-9_]'。
\xn 比對 n,其中 n 為十六進制轉義值。十六進制轉義值必須為确定的兩個數字長。例如, '\x41' 比對 "A"。'\x041' 則等價于 '\x04' & "1"。正規表達式中可以使用 ASCII 編碼。.
\num 比對 num,其中 num 是一個正整數。對所擷取的比對的引用。例如,'(.)\1' 比對兩個連續的相同字元。
辨別一個八進制轉義值或一個後向引用。如果 \n 之前至少 n 個擷取的子表達式,則 n 為後向引用。否則,如果 n 為八進制數字 (0-7),則 n 為一個八進制轉義值。
\nm 辨別一個八進制轉義值或一個後向引用。如果 \nm 之前至少有is preceded by at least nm 個擷取得子表達式,則 nm 為後向引用。如果 \nm 之前至少有 n 個擷取,則 n 為一個後跟文字 m 的後向引用。如果前面的條件都不滿足,若 n 和 m 均為八進制數字 (0-7),則 \nm 将比對八進制轉義值 nm。
\nml 如果 n 為八進制數字 (0-3),且 m 和 l 均為八進制數字 (0-7),則比對八進制轉義值 nml。
\un 比對 n,其中 n 是一個用四個十六進制數字表示的 Unicode 字元。例如, \u00A9 比對版權符号 (?)。

常用正則:

1.驗證使用者名和密碼:( "^[a-zA-Z]\w{5,15}$ ")正确格式: "[A-Z][a-z]_[0-9] "組成,并且第一個字必須為字母6~16位;

2.驗證電話号碼:( "^(\d{3.4}-)\d{7,8}$ ")正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx;

3.驗證×××号(15位或18位數字):( "^\d{15} ¦\d{18}$ ");

4.驗證Email位址:( "^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ ");

5.隻能輸入由數字和26個英文字母組成的字元串:( "^[A-Za-z0-9]+$ ") ;

6.整數或者小數:^[0-9]+\.{0,1}[0-9]{0,2}$

7.隻能輸入數字: "^[0-9]*$ "。

8.隻能輸入n位的數字: "^\d{n}$ "。

9.隻能輸入至少n位的數字: "^\d{n,}$ "。

10.隻能輸入m~n位的數字:。 "^\d{m,n}$ "

11.隻能輸入零和非零開頭的數字: "^(0 ¦[1-9][0-9]*)$ "。

12.隻能輸入有兩位小數的正實數: "^[0-9]+(.[0-9]{2})?$ "。

13.隻能輸入有1~3位小數的正實數: "^[0-9]+(.[0-9]{1,3})?$ "。

14.隻能輸入非零的正整數: "^\+?[1-9][0-9]*$ "。

15.隻能輸入非零的負整數: "^\-[1-9][]0-9 "*$。

16.隻能輸入長度為3的字元: "^.{3}$ "。

17.隻能輸入由26個英文字母組成的字元串: "^[A-Za-z]+$ "。

18.隻能輸入由26個大寫英文字母組成的字元串: "^[A-Z]+$ "。

19.隻能輸入由26個小寫英文字母組成的字元串: "^[a-z]+$ "。

20.驗證是否含有^%& &apos;,;=?$\ "等字元: "[^%& &apos;,;=?$\x22]+ "。

21.隻能輸入漢字: "^[\u4e00-\u9fa5]{0,}$ "

22.驗證URL: "^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ "。

23.驗證一年的12個月: "^(0?[1-9] ¦1[0-2])$ "正确格式為: "01 "~ "09 "和 "1 "~ "12 "。

24.驗證一個月的31天: "^((0?[1-9]) ¦((1 ¦2)[0-9]) ¦30 ¦31)$ "正确格式為; "01 "~ "09 "和 "1 "~ "31 "。

25."^\d+$ "  //非負整數(正整數 + 0)

26."^[0-9]*[1-9][0-9]*$ "  //正整數

27."^((-\d+) ¦(0+))$ "  //非正整數(負整數 + 0)

28."^-[0-9]*[1-9][0-9]*$ "  //負整數

29."^-?\d+$ "    //整數

30."^\d+(\.\d+)?$ "  //非負浮點數(正浮點數 + 0)

31."^(([0-9]+\.[0-9]*[1-9][0-9]*) ¦([0-9]*[1-9][0-9]*\.[0-9]+) ¦([0-9]*[1-9][0-9]*))$ "  //正浮點數

32."^((-\d+(\.\d+)?) ¦(0+(\.0+)?))$ "  //非正浮點數(負浮點數 + 0)

33."^(-(([0-9]+\.[0-9]*[1-9][0-9]*) ¦([0-9]*[1-9][0-9]*\.[0-9]+) ¦([0-9]*[1-9][0-9]*)))$ "  //負浮點數

34."^(-?\d+)(\.\d+)?$ "  //浮點數

35."^[A-Za-z]+$ "  //由26個英文字母組成的字元串

36."^[A-Z]+$ "  //由26個英文字母的大寫組成的字元串

37."^[a-z]+$ "  //由26個英文字母的小寫組成的字元串

38."^[A-Za-z0-9]+$ "  //由數字和26個英文字母組成的字元串

39."^\w+$ "  //由數字、26個英文字母或者下劃線組成的字元串

40."^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$ "    //email位址

41."^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$ "  //url

42.提取資訊中的網絡連結: (h ¦H)(r ¦R)(e ¦E)(f ¦F) *= *( &apos; ¦ ")?(\w ¦\\ ¦\/ ¦\.)+( &apos; ¦ " ¦ * ¦ >)?

43.提取資訊中的郵件位址: \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

44.提取資訊中的圖檔連結: (s ¦S)(r ¦R)(c ¦C) *= *( &apos; ¦ ")?(\w ¦\\ ¦\/ ¦\.)+( &apos; ¦ " ¦ * ¦ >)?

45.提取資訊中的ip位址: (\d+)\.(\d+)\.(\d+)\.(\d+)

46.提取資訊中的中國手機号碼: (86)*0*13\d{9}

47.提取資訊中的中國固定電話号碼: (\(\d{3,4}\) ¦\d{3,4}- ¦\s)?\d{8}

48.提取資訊中的中國電話号碼(包括移動和固定電話): (\(\d{3,4}\) ¦\d{3,4}- ¦\s)?\d{7,14}

49.提取資訊中的中國郵政編碼: [1-9]{1}(\d+){5}

50.提取資訊中的中國×××号碼: \d{18} ¦\d{15}

51.提取資訊中的整數: \d+

52.提取資訊中的浮點數(即小數):(-?\d*)\.?\d+

53.提取資訊中的任何數字 : (-?\d*)(\.\d+)?

54.提取資訊中的中文字元串: [\u4e00-\u9fa5]*

55.提取資訊中的雙位元組字元串 (漢字):[^\x00-\xff]*

56.提取資訊中的英文字元串:\w*

57.提取任意HTML标記之間的内容:<script[\s\S]+</script *>

58.高強度日期驗證

      ^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$

59.高強度日期+時間驗證

     ^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$

從上面我們可以看到: "^ "表示後面緊跟着的字元為開頭;與之相對應的式 "$ "以緊跟前面的字元為結尾.但是要注意的式當 "^ "位于 "[] "裡時,表示 "非 "的意思,例如:[^AZ]表示不能為 "AZ "中的任一個字元. "[] "表示當中的一個字元. "{} "可以取得一個範圍,例如 "{9} "表示9個,而 "{1,9} "表示1到9個字元.