正則表達式是一種特殊序列的字符,它通過使用有專門語法的模式來匹配或查找字符串集合。
正則表達式用事先定義好的一些特定字符、及這些特定字符的組合,組成一個"規則字符串",這個"規則字符串"用來表達對字符串的一種過濾邏輯。
正則表達式從字面上看是一種介於斜槓之間或介於跟在 %r 後的任意分隔符之間的模式,如下所示:
/pattern/ /pattern/im # 可以指定選項 %r!/usr/local! # 使用分隔符的正則表達式以上實例運行輸出結果為:
Line1 contains Cats
正則表達式從字面上看可能包含一個可選的修飾符,用於控制各方面的匹配。修飾符在第二個斜槓字符後指定,如上面實例所示。下標列出了 可能的修飾符:
修飾符描述 i當匹配文本時忽略大小寫。 o只執行一次 #{} 插值,正則表達式在第一次時就進行判斷。 x忽略空格,允許在整個表達式中放入空白符和注釋。 m匹配多行,把換行字符識別為正常字符。 u,e,s,n把正則表達式解釋為 Unicode(UTF-8)、EUC、SJIS 或 ASCII。如果沒有指定修飾符,則認為正則表達式使用的是源編碼。就像字符串通過 %Q 進行分隔一樣,Ruby 允許您以 %r 作為正則表達式的開頭,後面跟著任意分隔符。這在描述包含大量您不想轉義的斜槓字符時非常有用。
# 下面匹配單個斜槓字符,不轉義 %r|/| # Flag 字符可通過下面的語法進行匹配 %r[</(.*)>]i除了控制字符,(+ ? . * ^ $ ( ) [ ] { } | \),其他所有字符都匹配本身。您可以通過在控制字符前放置一個反斜槓來對控制字符進行轉義。
下表列出了 Ruby 中可用的正則表達式語法。
模式描述 ^匹配行的開頭。 $匹配行的結尾。 .匹配除了換行符以外的任意單字符。使用 m 選項時,它也可以匹配換行符。 [...]匹配在方括號中的任意單字符。 [^...]匹配不在方括號中的任意單字符。 re*匹配前面的子表達式零次或多次。 re+匹配前面的子表達式一次或多次。 re?匹配前面的子表達式零次或一次。 re{ n}匹配前面的子表達式 n 次。 re{ n,}匹配前面的子表達式 n 次或 n 次以上。 re{ n, m}匹配前面的子表達式至少 n 次至多 m 次。 a| b匹配 a 或 b。 (re)對正則表達式進行分組,並記住匹配文本。 (?imx)暫時打開正則表達式內的 i、 m 或 x 選項。如果在圓括號中,則只影響圓括號內的部分。 (?-imx)暫時關閉正則表達式內的 i、 m 或 x 選項。如果在圓括號中,則只影響圓括號內的部分。 (?: re)對正則表達式進行分組,但不記住匹配文本。 (?imx: re)暫時打開圓括號內的 i、 m 或 x 選項。 (?-imx: re)暫時關閉圓括號內的 i、 m 或 x 選項。 (?#...)注釋。 (?= re)使用模式指定位置。沒有范圍。 (?! re)使用模式的否定指定位置。沒有范圍。 (?> re)匹配無回溯的獨立模式。 \w匹配單詞字符。 \W匹配非單詞字符。 \s匹配空白字符。等價於 [\t\n\r\f]。 \S匹配非空白字符。 \d匹配數字。等價於 [0-9]。 \D匹配非數字。 \A匹配字符串的開頭。 \Z匹配字符串的結尾。如果存在換行符,則只匹配到換行符之前。 \z匹配字符串的結尾。 \G匹配最後一個匹配完成的點。 \b當在括號外時匹配單詞邊界,當在括號內時匹配退格鍵(0x08)。 \B匹配非單詞邊界。 \n, \t, etc.匹配換行符、回車符、制表符,等等。 \1...\9匹配第 n 個分組子表達式。 \10如果已匹配過,則匹配第 n 個分組子表達式。否則指向字符編碼的八進制表示。這會匹配最小次數的重復。
實例描述 /<.*>/貪婪重復:匹配 "<ruby>perl>" /<.*?>/ 非貪婪重復:匹配 "<ruby>perl>" 中的 "<ruby>"這會再次匹配之前匹配過的分組。
實例描述 /([Rr])uby&\1ails/匹配 ruby&rails 或 Ruby&Rails /(['"])(?:(?!\1).)*\1/單引號或雙引號字符串。\1 匹配第一個分組所匹配的字符,\2 匹配第二個分組所匹配的字符,依此類推。這需要指定匹配位置。
實例描述 /^Ruby/匹配以 "Ruby" 開頭的字符串或行 /Ruby$/ 匹配以 "Ruby" 結尾的字符串或行 /\ARuby/ 匹配以 "Ruby" 開頭的字符串 /Ruby\Z/匹配以 "Ruby" 結尾的字符串 /\bRuby\b/匹配單詞邊界的 "Ruby" /\brub\B/\B 是非單詞邊界:匹配 "rube" 和 "ruby" 中的 "rub",但不匹配單獨的 "rub" /Ruby(?=!)/如果 "Ruby" 後跟著一個感歎號,則匹配 "Ruby" /Ruby(?!!)/ 如果 "Ruby" 後沒有跟著一個感歎號,則匹配 "Ruby"sub 和 gsub 及它們的替代變量 sub! 和 gsub! 是使用正則表達式時重要的字符串方法。
所有這些方法都是使用正則表達式模式執行搜索與替換操作。sub 和 sub! 替換模式的第一次出現,gsub 和 gsub! 替換模式的所有出現。
sub 和 gsub 返回一個新的字符串,保持原始的字符串不被修改,而 sub! 和 gsub! 則會修改它們調用的字符串。
以上實例運行輸出結果為:
電話號碼 : 138-3453-1111 電話號碼 : 13834531111
以上實例運行輸出結果為:
Rails 是 Rails, Ruby on Rails 非常好的 Ruby 框架