 |
後向引用 字符簇 下面是 ruby 支持的正則表達式符號(元字符)一覽表。
不帶 \ 的字母和數字不是元字符 帶 \ 的符號不是元字符 有如此規則。
^ 行首。匹配輸入字符串頭部或換行符之後的位置。
$ 行尾。匹配輸入字符串尾部或換行符之前的位置。 p "\n".gsub(/$/, "o") # => "o\no"
. 匹配除換行符之外的任何單個字符(多字節字符的話就不是一個字節而是一個字符)。使用正則表達式選項 m(多行模式。參考正則表達式字面值),則可以匹配含有換行符在內的任意單個字符。 p /./e =~ " あ "[0,1] # => nil
\w 匹配包括下劃線的任何字母數字字符。等同於[0-9A-Za-z_]。 中文的全形字符也匹配。
\W 匹配任何非字母數字字符。\w 以外的字符。
\s 匹配任何空字符,包括空格、制表符、換頁符等等。等同於[ \t\n\r\f\v]。
\S 匹配任何非空字符。[ \t\n\r\f\v]以外的字符。
\d 匹配一個數字字符。等同於[0-9]。
\D 匹配一個非數字字符。
\A 匹配字符串頭部。和 ^ 不同,換行對其無影響。
\Z 匹配字符串尾部。字符串以換行結束的話則匹配換行之前的位置。 p "\n".gsub(/\Z/, "o") # => "o\no"
\z 匹配字符串尾部。與 $ 和 \Z 不同的是換行對其無影響。
\b 匹配字符類指定的單詞邊界(匹配 \w 和 \W 之間),也就是指單詞和空格間的位置。字符類指定為退格符(0x08)。例如,'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' 字符。
\f 匹配一個換頁符。等同於 \x0c 和 \cL。
\n 匹配一個換行符。等同於 \x0a 和 \cJ。
\r 匹配一個回車符。等同於 \x0d 和 \cM。
\t 匹配一個制表符。等同於 \x09 和 \cI。
\v 匹配一個垂直制表符。等同於 \x0b 和 \cK。
\xn 匹配 n,其中 n 為十六進位轉義值。十六進位轉義值必須為確定的兩個數字長。例如,'\x41' 匹配 "A"。'\x041' 則等同於 '\x04' & "1"。正則表達式中可以使用 ASCII 編碼。
\num 匹配 num,其中 num 是一個正整數。對所獲取的匹配的引用。例如,'(.)\1' 匹配兩個連續的相同字符。
\n 標識一個八進位轉義值或一個向後引用。如果 \n 之前至少 n 個獲取的子表達式,則 n 為向後引用。否則,如果 n 為八進位數字 (0-7),則 n 為一個八進位轉義值。
\nm 標識一個八進位轉義值或一個向後引用。如果 \nm 之前至少有 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 匹配版權符號 (?)。
\G 在上次成功匹配的地方(之後)進行匹配(不留間隔)。只有在首次使用時才會匹配到頭部(與 \A 相同)。 可以在 scan 和 gsub 中使用。當您想在上次匹配的地方之後再進行匹配的話,可以使用。 # 從頭取出 3 位數字(數字必須相連)。 str = "123456 789" str.scan(/\G\d\d\d/) {|m| p m }
[ ] 指定字符簇。請參考字符簇。
* 匹配前面的子表達式零次或多次。儘可能匹配較長的部分。例如,zo* 能匹配 "z" 以及 "zoo"。* 等同於{0,}。
*? 負責指定數量(quantifiers)。表示前面子表達式至少出現零次(儘量匹配短的部分)。
+ 負責指定數量(quantifiers)。表示前面子表達式至少出現 1 次
+? 負責指定數量(quantifiers)。表示前面子表達式至少出現 1 次(儘量匹配短的部分)。
{m} {m,} {m,n} 指定子表達式重複出現的次數(interval quantifier)。分別表示前面子表達式重複出現
m 次 至少 m 次 至少 m 次,至多 n 次 {,n} 或 {,} 將導致匹配失敗。 str = "foofoofoo" p str[/(foo){1}/] # => "foo" p str[/(foo){2,}/] # => "foofoofoo" p str[/(foo){1,2}/] # => "foofoo" 正則表達式 ?、*、+ 分別等同於 {0,1}、{0,}、{1,}。
{m}? {m,}? {m,n}? 指定子表達式重複出現的次數(interval quantifier)。分別表示前面子表達式重複出現
m 次 至少 m 次 m 回以上、最大 n 回 (儘量匹配短的部分)。
? 負責指定數量(quantifiers)。表示前面子表達式至多出現 1 次。
?? 負責指定數量(quantifiers)。表示前面子表達式至多出現 1 次(儘量匹配短的部分)。
| 選擇(alternative)。
( ) 正則表達式的群組化。與括號中的正則表達式相匹配的字符串將被保存下來,供後向引用使用。
\1, \2 ... \n 後向引用(back reference)。請參考後向引用。
(?# ) 注釋。括號中的任意字符串將被忽視。
(?: ) 不具備後向引用功能的群組化。它不為 \1,\2(或 $1,$2)提供服務,是一種單純的群組功能。 /(abc)/ =~ "abc" p $1 => "abc" /(?:abc)/ =~ "abc" p $1 => nil
(?= ) 先行(lookahead)。使用 pattern 指定位置(不留間隔)。 (?=re1)re2 表示同時匹配 re1 和 re2 的正則表達式。 re1(?=re2) 表示在後面緊跟著匹配 re2 字符串的正則表達式 re1。 p /foo(?=bar)/ =~ "foobar" # => 0 p $& # => "foo" (沒有 bar 部分的信息)
(?! ) 否定先行(negative lookahead)。使用否定的 pattern 來指定位置(不留間隔)。 (?!re1)re2 表示不匹配 re1 匹配 re2 的正則表達式。 # 除 000 以外的 3 位數字 re = /(?!000)\d\d\d/ p re =~ "000" # => nil p re =~ "012" # => 0 p re =~ "123" # => 0 # C 語言標識符(首位是[A-Za-z_]然後是[0-9A-Za-z_]的字符串) /\b(?![0-9])\w+\b/
(?ixm-ixm) 正則表達式中的 i 選項、x 選項、m 選項的開關。請您參考正則表達式字面值來了解選項的詳細內容。 re = /A(?i)a(?-i)A/ p re =~ "AaA" # => 0 p re =~ "AAA" # => 0 p re =~ "AAa" # => nil
(?ixm-ixm: ) 括號中的 i 選項、x 選項、m 選項的開關。在括號範圍內有效。 re = /A(?i:a)A/ p re =~ "AaA" # => 0 p re =~ "AAA" # => 0 p re =~ "AAa" # => nil 後向引用正則表達式 \1 \2 ... \n 表示後向引用。\n 表示將匹配第 n 個括號(正則表達式的()表示群)的內容保存起來,供後面使用。 /((foo)bar)\1\2/ 和 /((foo)bar)foobarfoo/ 是一樣的。 例子: re = /(foo|bar|baz)\1/ p re =~ 'foofoo' # => 0 p re =~ 'barbar' # => 0 p re =~ 'bazbaz' # => 0 p re =~ 'foobar' # => nil 對應的括號必須位於後向引用表達式的左側。 若後向引用表達式位於對應的括號中時,匹配常常會失敗。當後向引用表達式中的數字是 1 位,且沒有對應的括號時,匹配也將失敗。 p /(\1)/ =~ "foofoofoo" # => nil p /(foo)\2/ =~ "foo\2" # => nil 雖然可以指定 2 位以上的後向引用表達式,但是不要把它同控制碼的 \nnn(對應於八進位數 nnn 的字符)混為一談。當數字只有 1 位時,通常是後向引用表達式。當指定了一個超過 2 位的數字時,若沒有對應括號的話,則被看作是八進位代碼。 相反地,若在正則表達式中使用 1 位的八進位代碼時,必須以 0 打頭,例如 \01 等(不可能存在形如 \0 這樣的後向引用表達式,因此不會混淆)。 p /\1/ =~ "\1" # => nil # 無對應括號的後向引用 p /\01/ =~ "\1" # => 0 八進位代碼 p /\11/ =~ "\11" # => 0 八進位代碼 # 八進位代碼(因為沒有對應括號) p /(.)\10/ =~ "1\10" # => 0 # 後向引用(因為有對應的括號) p /((((((((((.))))))))))\10/ =~ "aa" # => 0 # 八進位代碼(因為沒有像 "\0" + "8" -> \08 這樣的八進位代碼) p /(.)\08/ =~ "1\0008" # => 0 # 如果想在後向引用表達式之後插入數字的話,就必須使用括號加以分隔。 p /(.)(\1)1/ =~ "111" # => 0 字符簇正則表達式 [] 負責指定字符簇。這將匹配 [] 內列出的任何一個字符。 例如 /[abc]/ 表示只要匹配 "a"、"b"、"c" 中任何一個即可。也可以按照 ASCII 代碼順序,在連續的字符串之間插入「-」後寫成 /[a-c]/ 也是一樣的效果。另外,若開頭是「^」的話,表示要匹配指定字符之外的一個字符。 若「^」不在開頭的話,表示匹配該字符本身。同時,當「-」出現在頭或尾上時,表示匹配該字符本身。 p /[a^]/ =~ "^" # => 0 p /[-a]/ =~ "-" # => 0 p /[a-]/ =~ "-" # => 0 p /[-]/ =~ "-" # => 0 空的字符簇將會引發錯誤。 p /[]/ =~ "" p /[^]/ =~ "^" # => invalid regular expression; empty character class: /[^]/ 當「]」出現在開頭(或否定的「^」之後)時,表示「]」本身,而並非字符範圍的結尾。這樣的「]」推薦使用反斜線符號進行轉義。 p /[]]/ =~ "]" # => 0 p /[^]]/ =~ "]" # => nil 可以使用反斜線符號對 "^"、"-"、"]" 以及 "\\"(反斜線符號)進行轉義,使其匹配該字符本身。 p /[\^]/ =~ "^" # => 0 p /[\-]/ =~ "-" # => 0 p /[\]]/ =~ "]" # => 0 p /[\\]/ =~ "\\" # => 0 在 [] 中同字符串一樣可以使用控制碼,以及正則表達式 \w、\W、\s、\S、\d、\D(這些都是表示字符簇的簡寫法)。 請注意,下麵包含否定意味的字符簇也將匹配換行符(正則表達式 \W、\D 也是如此)。 p /[^a-z]/ =~ "\n" # => 0
|