快速入門
教學
工具和語言
範例
參考
書籍評論
正規表示式工具
grep
PowerGREP
RegexBuddy
RegexMagic
一般應用程式
EditPad Lite
EditPad Pro
語言和函式庫
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery 和 XPath
XRegExp
資料庫
MySQL
Oracle
PostgreSQL
本網站的更多資訊
簡介
正規表示式快速入門
正規表示式教學
替換字串教學
應用程式和語言
正規表示式範例
正規表示式參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS Feed 和部落格
RegexBuddy—The best regex editor and tester for Ruby developers!

使用正規表示式與 Ruby

Ruby 支援正規表示式作為語言功能。在 Ruby 中,正規表示式以 /pattern/modifiers 的形式撰寫,其中「pattern」是正規表示式本身,而「modifiers」是一系列表示各種選項的字元。這個「modifiers」部分是選用的。這個語法是從 Perl 借來的。Ruby 支援以下 modifiers

你可以透過將多個 modifiers 串接在一起的方式,來結合多個 modifiers,例如 /regex/is

在 Ruby 中,插入符號和美元符號總是在換行符號之前和之後比對。Ruby 沒有 modifiers 可以變更這個設定。使用 \A\Z比對字串的開頭或結尾

由於正斜線界定正規表示式,因此出現在正規表示式中的任何正斜線都需要跳脫。例如,正規表示式 1/2 在 Ruby 中寫成 /1\/2/

如何使用 Regexp 物件

/regex/ 會建立 Regexp 類別的新物件。您可以將它指定給變數,以重複使用相同的正規表示式,或直接使用文字正規表示式。Ruby 提供了數種不同的方式來測試特定正規表示式是否符合(部分)字串。

=== 方法允許您將正規表示式與字串進行比較。如果正規表示式符合(部分)字串,則傳回 true,否則傳回 false。這允許在 case 陳述式中使用正規表示式。請勿將 ===(三個等號)與 ==(兩個等號)混淆。== 允許您將一個正規表示式與另一個正規表示式進行比較,以查看兩個正規表示式是否相同並使用相同的比對模式。

=~ 方法傳回比對開始處的字串字元位置,或在找不到比對時傳回 nil。在布林測試中,字元位置會評估為 true,而 nil 會評估為 false。因此,您可以使用 =~ 取代 ===,讓您的程式碼更容易閱讀,因為 =~ 顯然是一個正規表示式比對運算子。Ruby 從 Perl 借用了 =~ 語法。print(/\w+/ =~ "test") 會印出「0」。字串中的第一個字元索引為零。切換 =~ 運算子的運算元順序並不會造成任何差異。

match() 方法在找到比對時傳回 MatchData 物件,或在找不到比對時傳回 nil。在布林環境中,MatchData 物件會評估為 true。在字串環境中,MatchData 物件會評估為比對到的文字。因此,print(/\w+/.match("test")) 會印出「test」。

Ruby 2.4 新增了 match?() 方法。它會像 === 方法一樣傳回 true 或 false。不同之處在於 match?() 沒有設定 $~(請見下方),因此不需要建立 MatchData 物件。如果您不需要任何比對詳細資料,您應該使用 match?() 來提升效能。

特殊變數

====~match() 方法會建立 MatchData 物件並將它指定給特殊變數 $~Regexp.match() 也會傳回這個物件。變數 $~ 是執行緒本機和方法本機的。這表示您可以在方法結束之前或在方法中下次使用 =~ 運算子之前使用這個變數,而不用擔心另一個執行緒或執行緒中的另一個方法會覆寫它們。

許多其他特殊變數都是從 $~ 變數衍生而來的。這些變數都是唯讀的。如果您將新的 MatchData 實例指定給 $~,所有這些變數也會跟著改變。$& 包含整個正規表示式所配對到的文字。$1$2 等則包含由第一個、第二個等擷取群組所配對到的文字。$+ 包含由實際參與配對的編號最高的擷取群組所配對到的文字。$`$' 包含正規表示式配對左右兩側的受測字串文字。

搜尋和取代

使用字串類別的 sub()gsub() 方法分別搜尋並取代字串中的第一個正規表示式配對或所有正規表示式配對。將您要搜尋的正規表示式指定為第一個參數,將取代字串指定為第二個參數,例如:result = subject.gsub(/before/, "after")

若要重新插入正規表示式配對,請在取代字串中使用 \0。您可以在取代字串中使用反向參照 \1\2\3 等來使用 擷取群組 的內容。請注意,在雙引號字串中,以反斜線作為跳脫字元的數字會被視為八進位跳脫字元。八進位跳脫字元會在語言層級中處理,在 sub() 函式看到參數之前。若要防止這種情況,您需要在雙引號字串中跳脫反斜線。因此,若要使用第一個反向參照作為取代字串,請傳遞 '\1'"\\1"'\\1' 也可以使用。

分割字串和收集配對

若要將字串中的所有正規表示式配對收集到陣列中,請將正規表示式物件傳遞給字串的 scan() 方法,例如:myarray = mystring.scan(/regex/)。有時,建立正規表示式來配對分隔符號會比配對您有興趣的文字容易。在這種情況下,請改用 split() 方法,例如:myarray = mystring.split(/delimiter/)split() 方法會捨棄所有正規表示式配對,傳回配對之間的文字。scan() 方法則相反。

如果您的正規表示式包含 擷取群組scan() 會傳回陣列的陣列。整體陣列中的每個元素都包含一個陣列,其中包含整體正規表示式比對,以及所有擷取群組比對到的文字。

| 快速入門 | 教學 | 工具和語言 | 範例 | 參考 | 書籍評論 |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery 和 XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |