クイック スタート
チュートリアル
ツール & 言語
リファレンス
書籍 レビュー
正規表現ツール
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フィードとブログ
RegexBuddy—The best regex editor and tester for Ruby developers!

Ruby での正規表現の使用

Ruby は言語機能として正規表現をサポートしています。Ruby では、正規表現は次の形式で記述されます。/パターン/修飾子ここで、「パターン」は正規表現自体であり、「修飾子」はさまざまなオプションを示す一連の文字です。「修飾子」の部分は省略可能です。この構文は Perl から借用されています。Ruby は次の 修飾子 をサポートしています。

複数の修飾子を次のように連結することで組み合わせることができます。/regex/is.

Ruby では、キャレットとドルは常に改行の前と後に一致します。Ruby にはこれを変更する修飾子はありません。次を使用します。\A\Z文字列の先頭または末尾に一致させるため。

フォワードスラッシュが正規表現を区切るため、正規表現内に出現するフォワードスラッシュはエスケープする必要があります。たとえば、正規表現1/2は Ruby では次のように記述されます。/1\/2/

Regexp オブジェクトの使用方法

/regex/は、Regexp クラスの新しいオブジェクトを作成します。それを変数に代入して同じ正規表現を繰り返し使用したり、リテラル正規表現を直接使用したりできます。Ruby は、特定の正規表現が文字列(の一部)と一致するかどうかをテストするいくつかの異なる方法を提供します。

===メソッドを使用すると、正規表現を文字列と比較できます。正規表現が文字列(の一部)と一致する場合は true を返し、一致しない場合は false を返します。これにより、case 文で正規表現を使用できます。===(3 つの等号) と==(2 つの等号) を混同しないでください。==を使用すると、2 つの正規表現が同一で同じマッチングモードを使用しているかどうかを確認するために、1 つの正規表現を別の正規表現と比較できます。

=~メソッドは、一致が検出された場合は文字列内の開始位置の文字位置を返し、一致が見つからなかった場合は 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、などは、最初、2 番目、およびそれ以降のキャプチャグループによって一致したテキストを保持します。$+は、一致に実際に参加した最も大きい番号のキャプチャグループによって一致したテキストを保持します。$`$'は、正規表現一致の左側と右側の対象文字列のテキストを保持します。

検索と置換

文字列クラスのsub()gsub()メソッドを使用して、文字列内の最初の正規表現一致、またはすべての正規表現一致をそれぞれ検索および置換します。検索する正規表現を最初のパラメーターとして、置換文字列を 2 番目のパラメーターとして指定します。例:result = subject.gsub(/before/, "after").

正規表現一致を再挿入するには、置換文字列で\0を使用します。置換文字列で キャプチャグループ の内容を、後方参照\1, \2, \3などを使用して使用できます。バックスラッシュでエスケープされた数字は、二重引用符付き文字列では 8 進エスケープとして扱われることに注意してください。8 進エスケープは、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 |