Rubyの正規表現


正規表現 は、特殊な構文のパターンを使用して一連の文字列を照合または検索する特別な文字シーケンスです。

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

構文

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

/pattern/
/pattern/im    # 可以指定选项
%r!/usr/local! # 使用分隔符的正则表达式

Example

#!/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 #{} 補間を 1 回だけ実行し、正規表現は最初に評価されます。
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| b は a または b と一致します。
(再)正規表現をグループ化し、テキストと一致することを忘れないでください。
(?imx)正規表現内の i、m、または x オプションを一時的にオンにします。括弧内にある場合は、括弧内の部分のみが影響を受けます。
(?-imx)正規表現内の i、m、または x オプションを一時的にオフにします。括弧内にある場合は、括弧内の部分のみが影響を受けます。
(?: re) 正規表現をグループ化しますが、テキストの一致を記憶しません。
(?imx: re)括弧内の i、m、または x オプションを一時的にオンにします。
(?-imx: re)括弧内の i、m、または x オプションを一時的にオフにします。
(?#...)のコメント。
(?= re)パターンを使用して位置を指定します。範囲はありません。
(?!再)パターンの否定を利用して位置を指定します。範囲はありません。
(?>再)は、バックトラックせずにスタンドアロン モードに一致します。
w 単語の文字を一致させます。
W は単語以外の文字と一致します。
s は空白文字と一致します。 [tnrf]と同等。
S は空白以外の文字と一致します。
d 数字を合わせてください。 [0-9]に相当します。
D は数字以外に一致します。
Aは文字列の先頭と一致します。
Zは文字列の末尾と一致します。改行文字が存在する場合は、その改行文字までのみ一致します。
zは文字列の末尾と一致します。
G マッチが完了した最後のポイントをマッチさせます。
b 括弧の外側の場合は単語の境界に一致し、括弧の内側の場合はバックスペース (0x08) に一致します。
B は単語以外の境界に一致します。
n、t などは改行、復帰、タブなどに一致します。
1...9は、n 番目にグループ化された部分式と一致します。
10すでに一致している場合は、n 番目のグループ化された部分式と一致します。それ以外の場合は、文字エンコーディングの 8 進表現を指します。

正規表現の例

文字

説明
/ruby/match "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/ は、/[trnf]/
/S/ と同等の空白文字と一致します。/[^trnf]/
/ w/ と同等の非空白文字と一致します。 は、/[A-Za-z0-9_]/
/W/ と同等の単語文字と一致します。/[^A-Za-z0-9_] / と同等の非単語文字と一致します。

repeat

インスタンスの説明
/ruby?/は、「ru​​b」または「ruby」と一致します。このうち、y はオプションです。
/ruby*/ は、「ru​​b」に 0 個以上の y を加えたものと一致します。
/ruby+/ は、「ru​​b」に 1 つ以上の y を加えたものと一致します。
/d{3}/ は 3 つの数字に正確に一致します。
/d{3,}/ 3 つ以上の数字を一致させます。
/d{3,5}/ 3、4、または 5 つの数字を一致させます。

非貪欲な繰り返し

これは、繰り返しの最小数と一致します。

インスタンス説明
/<.*>/貪欲な重複: "<ruby>perl>"と一致
/<.*?>/ 貪欲でない繰り返し: "& lt; Ruby & gt; perl & gt;" & lt; Ruby グループ化: + 繰り返し d
/(Dd)+/

: + 繰り返し Dd 「Ruby」、「Ruby、ruby、ruby」などと一致します。 バックリファレンス これは、以前に一致したグループと再度一致します。 説明はruby&railsまたはRuby&Rails一重引用符または二重引用符の文字列。1 は最初のグループに一致する文字に一致し、2 は 2 番目のグループに一致する文字に一致します。
インスタンス
/([Rr])uby&1ails/
/(['"])(?:(?!1).)*1 /

/ruby|rube など。 /

「ruby」または「rube」と一致します/rub(y|le))/「ruby」または「ruble」と一致します/ruby (!! ^Ruby/はaと一致します) "Ruby" で始まる文字列または行/Ruby$/は "Ruby" で終わる文字列または行と一致します

/ARuby/

"Ruby" で終わる文字列または行と一致します " 文字列と一致/rubyz/で始まる「ruby」で終わる文字列の一致/brubyb/boundaryの「ルビー」と一致する/brubb/byes fals 「rube」と「ruby」の「rub」ですが、「rub」単独ではありません/Ruby(?=!)/ 「Ruby」の後に感嘆符「Ruby」が続く場合に一致します

/Ruby(?!!)/

「Ruby」の後に感嘆符が続かない場合は、「Ruby」と一致します

かっこの特別な構文

説明
/R(?#comment)/は「R」と一致します。残りの文字はすべてコメントです。
/R(?i)uby/「uby」と一致する場合、大文字と小文字は区別されません。
/R(?i:uby)/同上。
/rub(?:y|le))/ グループ化のみ、1 つの後方参照なし

subgsub およびそれらの置換変数を検索して置換します sub!gsub! は、正規表現を使用する場合に重要な文字列メソッドです。

これらのメソッドはすべて、正規表現パターンを使用して検索および置換操作を実行します。 subsub! はパターンの最初の出現を置き換え、 gsubgsub! はパターンのすべての出現を置き換えます。

subgsub は、元の文字列を変更せずに新しい文字列を返しますが、 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 框架