2009年6月1日 星期一

Regular Expression (RegExp) 正規表達式(正則表達式)

Tab的空白:\t

換行:\n

不分大小寫:(?i)(字串)

在 regular expression 中用括號括起來的部份視為一個群組,
而在 replacement 中可用 $ 加數字來帶入該群組對應的實際值,
所以最後才會有 "-$1-" , ( $1 代表第一個群組 )


更簡單的 寫法其實用 String.replaceAll() 就可以做到

1
2
String s = "123abc456AbC789";
String s2 = s.replaceAll("(?i)(abc)","-$1-");


(?i) 代表不分大小寫, 其他的就跟前述一樣囉


  1. ^
    寫在 pattern 第一個位置時,表示其後一符號必須出現在字串開頭的位置。寫在 pattern 中間位置時則為否定之意,表示字串中不可有 ^ 之後一符號的內容。
  2. $
    寫在 pattern 最後一個位置時,表示其前一符號必須出現在字串尾端的位置。寫在 pattern 中時無特別意義。
  3. *
    表示字串中有 0 到無數個其前一符號的內容。
  4. +
    表示字串中有 1 到無數個其前一符號的內容。
  5. ?
    表示字串中有 0 到 1個其前一符號的內容。
  6. { }
    表示前一符號在字串中的重覆次數。例如 /A{2}/ 表示 'A' 重覆兩次 (即 'AA') ;/A{2,}/ 表示字串含有 2 到無數多個 'A' ;/A{2,5}/ 表示含有 2 到 5 個 'A' 。
  7. .
    表示一個任意字元。
  8. [ ]
    表示字串含有括號中任一字元的內容。可以 - 表示一組連續字元,例如 /[a-z]/, /[0-9]/ 。注意, [] 僅代表一個字元,例如 /[abc]/ 表示 'a' 或 'b' 或 'c' ,而不是 'abc' 。
  9. ( )
    表示一個 sub pattern ,符合 sub pattern 的字串內容會被存放在匹配陣列中,並依序指派數字代表此 sub pattern 。可以此數字在 pattern 的其他地方引用內容,例如 /The h([0-9]) means Title (\1)/ 表示第 1 個 sub pattern 是 0 到 9 的任一字元,而 \1 表示匹配的內容。故 'The h1 means Title 1', 'The h2 means Title 2' 到 'The h9 means Title 9' 符合規則。
  10. \
    表示轉義 (escaping) ,將其後的字元視為一般字元。例如要表示字串中含有 '/' 字元時,就必須寫作 /\//
  11. |
    「或」意,字串中含有 '|' 之前一符號或後一符號的內容。例如 /image\.(jpg|png)/ 表示 'image.jpg' 或 'image.png' 。通常會用 () 括住 '|' 的前後符號。
  12. \d
    表示任何一個數字,意同 [0-9] 。
  13. \D
    表示任何一個非數字,意同 [^0-9] 。
  14. \w
    表示任何一個字元與數字以及 '_' ,意同 [a-zA-Z0-9_] 。
  15. \W
    表示任何一個 \w 以外的字元。
  16. \s
    表示任何一個空白符號,包括 \t, \v 等。
  17. \S
    表示任何一個非空白符號。


尋找最多字元的字及最少字元的字(Greedy and Lazy)
當RE下要搜尋一個範圍的重複時(如”.*”),它通常會尋找最多字元的符合字,也就是Greedy matching。舉例來說。

32. a.*b (開始為a結束為b的最多字元的符合字)
若有一字串是”aabab”,使用上述RE所得到的符合字串就是”aabab”,因為這是尋找最多字元的字。有時希望是符合最少字元的字也就是lazy matching。只要將重覆前述項目的表加上問號(?)就可以把它們全部變成lazy matching。因此”*?”代表的就是重覆任意次數,但是使用最少重覆的次數來符合。舉個例子來說:

33. a.*?b (開始為a結束為b的最少字元的符合字)
若有一字串是”aabab”,使用上述RE第一個所得到的符合字串就是”aab”再來是”ab”,因為這是尋找最少字元的字。

*? 重覆任意次數,最少重覆次數為原則
+? 重覆至少一次,最少重覆次數為原則
?? 重覆零次或一次,最少重覆次數為原則
{n,m}? 重覆至少n次,但不超過m次,最少重覆次數為原則
{n,}? 重覆至少n次,最少重覆次數為原則

一輩子受用的 Regular Expressions - 樣式比對 - 精華區 : 台灣PHP聯盟[ Taiwan PHP User Group ]

JavaScript replace new RegExp_一个人的精彩

石頭閒語:Regular Expression (RegExp) in JavaScript - 樂多日誌

Javascript Regex 的 字串比對(Match) 與 取代(Replace) | Tsung's Blog

JavaScript Kit- RegExp (regular expression) object

Regular Expression 在 replace 的應用

Regular Expression心得報告

網誌存檔