Ruby 正規表現

正規表現特別な文字シーケンスであり、専用の構文を持つパターンを使用して、文字列の集合をマッチングまたは検索します。

正規表現は、あらかじめ定義された特定の文字とそれらの組み合わせを使用して「規則文字列」を構成し、この「規則文字列」で文字列に対するフィルタリングロジックを表現します。

構文

正規表現文字通りには、スラッシュの間、または %r に続く任意の区切り文字の間にあるパターンです。次に示します:

/pattern/ /pattern/im #オプションを指定できます %r!/usr/local! #区切り文字を使用した正規表現

例

#!/usr/bin/ruby line1 = "Cats are smarter than dogs"; line2 = "Dogs also like meat"; if ( line1 =~ /Cats(.*)/ ) puts "Line1 contains Cats" end if ( line2 =~ /Cats(.*)/ ) puts "Line2 contains Dogs" end

試してみる »

上記の例の実行出力結果は次のとおりです:

Line1 contains Cats

正規表現修飾子

正規表現は、文字通り、マッチングのさまざまな側面を制御するオプションの修飾子を含むことができます。修飾子は、上記の例のように、2番目のスラッシュ文字の後に指定します。次の表に、可能な修飾子を示します:

修飾子説明
iテキストをマッチングするときに大文字と小文字を無視します。
o#{} の補間を一度だけ実行し、正規表現は最初の時点で評価されます。
x空白を無視し、式全体に空白文字とコメントを配置することを許可します。
m複数行にマッチングし、改行文字を通常の文字として認識します。
u,e,s,n正規表現を Unicode(UTF-8)、EUC、SJIS、または ASCII として解釈します。修飾子が指定されていない場合、正規表現はソースエンコーディングを使用すると見なされます。

文字列が %Q で区切られるのと同様に、Ruby では正規表現の先頭に %r を使用し、その後に任意の区切り文字を続けることができます。これは、エスケープしたくないスラッシュ文字を多数含む表現を記述する場合に非常に便利です。

#次は単一のスラッシュ文字をエスケープせずにマッチングします %r|/| # Flag 文字は次の構文でマッチさせることができます %r[</(.*)>]i

正規表現パターン

制御文字を除いて、(+ ? . * ^ $ ( ) [ ] { } | \)他のすべての文字はそれ自体にマッチします。制御文字の前にバックスラッシュを置くことで、制御文字をエスケープできます。

次の表に、Ruby で使用できる正規表現構文を示します。

パターン説明
^行の先頭にマッチします。
$行の末尾にマッチします。
.改行以外の任意の1文字にマッチします。m オプションを使用すると、改行にもマッチします。
[...]角括弧内の任意の1文字にマッチします。
[^...]角括弧内にない任意の1文字にマッチします。
re*直前の部分式に0回以上マッチします。
re+直前の部分式に1回以上マッチします。
re?直前の部分式に0回または1回マッチします。
re{ n}直前の部分式に n 回マッチします。
re{ n,}直前の部分式に n 回以上マッチします。
re{ n, m}直前の部分式に少なくとも n 回、最大で m 回マッチします。
a| ba または 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...\9n 番目のグループ化された部分式にマッチします。
\10すでにマッチしている場合は、n 番目のグループ化された部分式にマッチします。それ以外の場合は、文字エンコーディングの8進表現を指します。

正規表現の例

文字

例説明
/ruby/"ruby" にマッチ
¥Yen 記号にマッチします。Ruby 1.9 と Ruby 1.8 は複数の文字をサポートしています。

文字クラス

例説明
/[Rr]uby/ "Ruby" または "ruby" にマッチ
/rub[ye]/ "ruby" または "rube" にマッチ
/[aeiou]/任意の小文字の母音文字にマッチ
/[0-9]/ 任意の1つの数字にマッチ。/
/[a-z]/任意の小文字の ASCII 文字にマッチ
/[A-Z]/任意の大文字の ASCII 文字にマッチ
/[a-zA-Z0-9]/括弧内の任意の1文字にマッチ
/[^aeiou]/ 小文字の母音文字以外の任意の1文字にマッチ
/[^0-9]/任意の非数字文字にマッチ

特殊文字クラス

例説明
/./ 改行以外の任意の文字にマッチ
/./m 複数行モードでは、改行にもマッチ
/\d/1つの数字にマッチ。/[0-9]/ と同等
/\D/ 1つの非数字にマッチ。/[^0-9]/ と同等
/\s/1つの空白文字にマッチ。/[ \t\r\n\f]/ と同等
/\S/ 1つの非空白文字にマッチ。/[^ \t\r\n\f]/ と同等
/\w/ 1つの単語文字にマッチ。/[A-Za-z0-9_]/ と同等
/\W/1つの非単語文字にマッチ。/[^A-Za-z0-9_]/ と同等

繰り返し

例説明
/ruby?/ "rub" または "ruby" にマッチ。ここで y は省略可能です。
/ruby*/ "rub" に y が0個以上続くものにマッチ。
/ruby+/"rub" に y が1個以上続くものにマッチ。
/\d{3}/ちょうど3個の数字にマッチ。
/\d{3,}/3個以上の数字にマッチ。
/\d{3,5}/3個、4個、または5個の数字にマッチ。

非貪欲な繰り返し

これは最小回数の繰り返しにマッチします。

例説明
/<.*>/貪欲な繰り返し:"<ruby>perl>" にマッチ
/<.*?>/ 非貪欲な繰り返し:"<ruby>perl>" 内の "<ruby>" にマッチ

丸括弧によるグループ化

例説明
/\D\d+/ グループ化なし:+ は \d を繰り返す
/(\D\d)+/ グループ化:+ は \D\d のペアを繰り返す
/([Rr]uby(, )?)+/"Ruby"、"Ruby, ruby, ruby" などにマッチ

後方参照

これは以前にマッチしたグループを再度マッチします。

例説明
/([Rr])uby&\1ails/ruby&rails または Ruby&Rails にマッチ
/(['"])(?:(?!\1).)*\1/一重引用符または二重引用符で囲まれた文字列。\1 は最初のグループがマッチした文字にマッチし、\2 は2番目のグループがマッチした文字にマッチし、以下同様です。

選択

例説明
/ruby|rube/"ruby" または "rube" にマッチ
/rub(y|le)/"ruby" または "ruble" にマッチ
/ruby(!+|\?)/ "ruby" の後に1個以上の ! が続くか、または ? が1個続く

锚

これにはマッチ位置の指定が必要です。

例説明
/^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" にマッチする

丸括弧の特殊構文

例説明
/R(?#comment)/ "R" にマッチする。残りのすべての文字はコメントです。
/R(?i)uby/ "uby" をマッチするときは大文字と小文字を区別しません。
/R(?i:uby)/ 上記と同じです。
/rub(?:y|le))/グループ化のみで、\1 の後方参照は行いません。

検索と置換

subとgsubおよびそれらの代替変数sub!とgsub!正規表現を使用する際に重要な文字列メソッドです。

これらのメソッドはすべて、正規表現パターンを使用して検索と置換操作を実行します。subとsub!パターンの最初の出現を置換し、gsubとgsub!パターンのすべての出現を置換します。

subとgsub元の文字列を変更せずに新しい文字列を返します。一方、sub!とgsub!呼び出された文字列自体を変更します。

例

#!/usr/bin/ruby # -*- coding: UTF-8 -*- phone = "138-3453-1111 #これは電話番号です" #Ruby のコメントを削除 phone = phone.sub!(/#.*$/, "") puts "電話番号 : #{phone}" #数字以外の文字を削除 phone = phone.gsub!(/\D/, "") puts "電話番号 : #{phone}"

試してみる »

上記の例の実行出力結果は次のとおりです:

电话号码 : 138-3453-1111 
电话号码 : 13834531111

例

#!/usr/bin/ruby # -*- coding: UTF-8 -*- text = "rails は rails, Ruby on Rails は非常に優れた Ruby フレームワークです" #すべての "rails" を "Rails" に変更 text.gsub!("rails", "Rails") #すべての単語 "Rails" を先頭大文字に変更 text.gsub!(/\brails\b/, "Rails") puts "#{text}"

試してみる »

上記の例の実行出力結果は次のとおりです:

Rails 是 Rails,  Ruby on Rails 非常好的 Ruby 框架
その他の拡張