English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

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で利用できる正規表現の構文が示されています。

パターン説明
^行の開始をマッチングします。
$行の終わりをマッチングします。
.改行符以外の任意の単一文字をマッチングします。mオプションを使用すると、改行符もマッチングできます。
[...]方括号内の任意の単一文字をマッチングします。
[^...]方括号外の任意の単一文字をマッチングします。
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数字をマッチング。等価です。-9]。
\D非数字をマッチング
\A文字列の開始をマッチング
\Z文字列の終わりをマッチング。改行符がある場合、改行符までをマッチング
\z文字列の終わりをマッチング
\G最後のマッチングされたポイントをマッチング
\b括号外では単語境界をマッチング、括号内ではバックスペースキー(0x08)。
\B非単語境界をマッチング
\n, \t, etc.改行符、エンター、タブ、などをマッチング
\1...\9n番目のグループ子表現をマッチング
\10すでにマッチングされている場合、n番目のグループ子表現をマッチングします。そうでない場合は、文字コードの8進数表現を指します。

正規表現の例

文字

説明
/ruby/「ruby」をマッチング
¥円符号にマッチング。Ruby 1.9 および Ruby 1.8 複数の文字をサポート

文字クラス

説明
/[Rr]uby/「Ruby」または「ruby」をマッチング
/rub[ye]/"ruby"または"rube"にマッチします。
/[aeiou]/任意の小文字元音文字をマッチング
/[0-9]/任意の数字をマッチング。等価です。 /[0123456789]/ 同じ
/[a-z]/任意の小文字ASCII文字をマッチング
/[A-Z]/任意の大文字ASCII文字をマッチング
/[a-zA-Z0-9]/括号内の任意の文字をマッチング
/[^aeiou]/任意の非小文字元音文字の文字をマッチング
/[^0-9]/任意の非数字文字をマッチング

特殊文字クラス

説明
/./改行符以外の任意の文字をマッチング
/./mマルチラインモードでは、改行符もマッチングします。
/\d/数字をマッチング。等価です。 /[0-9]/
/\D/非数字をマッチング。等価です。 /[^0-9]/
/\s/空白文字をマッチング。等価です。 /[ \t\r\n\f]/
/\S/非空白文字をマッチング。等価です。 /[^ \t\r\n\f]/
/\w/単語文字をマッチング。等価です。 /[A-Za-z0-9_]/
/\W/非単語文字をマッチング。等価です。 /[^A-Za-z0-9_]/

リピート

説明
/ruby?/「rub」または「ruby」にマッチング。yは任意です。
/ruby*/「rub」にマッチングし、0個または複数の y
/ruby+/「rub」にマッチング 1 数字または複数の y
/\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 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 フレームワークです