サーチ…


名前付きのグループ。

Rubyは標準グループ構文(...)を名前付きグループ(?<name>...)拡張しています。これにより、グループの数を数えずに、名前で抽出することができます。

name_reg = /h(i|ello), my name is (?<name>.*)/i #i means case insensitive

name_input = "Hi, my name is Zaphod Beeblebrox"

match_data = name_reg.match(name_input) #returns either a MatchData object or nil
match_data = name_input.match(name_reg) #works either way

if match_data.nil? #Always check for nil! Common error.
  puts "No match"
else
  match[0] #=> "Hi, my name is Zaphod Beeblebrox"
  match[1] #=> "i" #the first group, (i|ello)
  match[2] #=> "Zaphod Beeblebrox"
  #Because it was a named group, we can get it by name
  match[:name]  #=> "Zaphod Beeblebrox"
  match["name"] #=> "Zaphod Beeblebrox"
  puts "Hello #{match[:name]}!"
end

一致のインデックスは、左括弧の順序に基づいてカウントされます(正規表現全体がインデックス0の最初のグループです)

reg = /(((a)b)c)(d)/
match = reg.match 'abcd'
match[0] #=> "abcd"
match[1] #=> "abc"
match[2] #=> "ab"
match[3] #=> "a"
match[4] #=> "d"

=〜演算子

if /hay/ =~ 'haystack'
  puts "There is hay in the word haystack"
end

注:注文は重要です。ほとんどの場合、 'haystack' =~ /hay/は同等ですが、副作用が異なる可能性があります。

  • 指定されたキャプチャグループからキャプチャされたregexp =~ strは、 Regexp#=~が呼び出されたときにのみローカル変数に割り当てられregexp =~ strregexp =~ str )。
  • 右のオペランドは任意のオブジェクトなので、 regexp =~ str Regexp#=~またはString#=~いずれかと呼ばれます。

これはtrue / falseの値を返さず、見つかった場合は一致のインデックスを返し、見つからなければnilを返します。ルビのすべての整数は真実(0を含む)であり、nilは偽であるため、これは機能します。ブール値を使用する場合は、 別の例に示すように#===を使用します。

数量化

Quantifiersでは、繰り返し文字列の数を指定できます。

  • ゼロまたは1:

    /a?/
    
  • ゼロまたは多く:

    /a*/
    
  • 1つまたは複数:

    /a+/
    
  • 正確な番号:

    /a{2,4}/ # Two, three or four
    /a{2,}/  # Two or more
    /a{,4}/  # Less than four (including zero)
    

デフォルトでは、 量指定子は欲張りです。つまり、一致している間にできるだけ多くの文字を取ります。通常これは目立たない:

/(?<site>.*) Stack Exchange/ =~ 'Motor Vehicle Maintenance & Repair Stack Exchange'

指定されたキャプチャグループsiteは、期待どおりに「自動車整備と修理」に設定されます。しかし、 'Stack Exchange'が文字列のオプション部分(代わりに 'Stack Overflow'になる可能性があるため)であれば、単純な解決策は期待通りに機能しません。

/(?<site>.*)( Stack Exchange)?/

このバージョンはまだ一致しますが、以来、名前のキャプチャは、「スタック交換」を含めます*貪欲にそれらの文字を食べます。解決策は* lazyを作るために別の疑問符を追加することです:

/(?<site>.*?)( Stack Exchange)?/

追加?任意の数量値にすると、それは怠惰になります。

文字クラス

記号の範囲について説明します。

シンボルを明示的に列挙することができます

/[abc]/ # 'a' or 'b' or 'c'

または範囲を使用する

/[a-z]/ # from 'a' to 'z'

範囲と単一シンボルを組み合わせることは可能です

/[a-cz]/ # 'a' or 'b' or 'c' or 'z'

先頭のダッシュ( - )は文字として扱われます

/[-a-c]/ # '-' or 'a' or 'b' or 'c'

前の記号に^^

/[^a-c]/ # Not 'a', 'b' or 'c'

広範なクラスと特殊文字のためのいくつかのショートカットと、行末

^  # Start of line
$  # End of line
\A # Start of string
\Z # End of string, excluding any new line at the end of string
\z # End of string
.  # Any single character
\s # Any whitespace character
\S # Any non-whitespace character
\d # Any digit
\D # Any non-digit
\w # Any word character (letter, number, underscore)
\W # Any non-word character
\b # Any word boundary

\nは単に改行と解釈されます

/または[]などの予約文字をエスケープするには、バックスラッシュ(左スラッシュ)を使用します。

\\ # => \
\[\] # => []

ケース・ステートメントの正規表現

switch文を使用して、文字列が複数の正規表現に一致するかどうかをテストできます。

case "Ruby is #1!"
when /\APython/
    puts "Boooo."
when /\ARuby/
    puts "You are right."
else 
    puts "Sorry, I didn't understand that."
end

これは、caseステートメントが==演算子ではなく、 ===演算子を使用して等しいかどうかがチェックされるためです。正規表現が===を使って比較の左側にあるとき、文字列をテストして一致するかどうかを調べます。

正規表現の定義

Regexpは、Rubyでは3つの異なる方法で作成できます。

  • スラッシュを使用して: / /

  • %r{}を使用して

  • Regex.newを使用して

    #The following forms are equivalent
    regexp_slash = /hello/
    regexp_bracket = %r{hello}
    regexp_new = Regexp.new('hello')
    
    string_to_match = "hello world!"
    
    #All of these will return a truthy value
    string_to_match =~ regexp_slash    # => 0
    string_to_match =~ regexp_bracket  # => 0
    string_to_match =~ regexp_new      # => 0
    

一致? - ブール結果

$~や他の関連する変数を更新せずにregexpが一致するかどうかを示すtrueまたはfalse返します。 2番目のパラメータが存在する場合は、検索を開始する文字列内の位置を指定します。

/R.../.match?("Ruby")    #=> true
/R.../.match?("Ruby", 1) #=> false
/P.../.match?("Ruby")    #=> false

Ruby 2.4以降

一般的なクイック使用法

正規表現は、他の文字列が存在するかどうかをチェックしたり、文字列を検索したり置換したりするためのパラメータとしてメソッドでよく使われます。

次のようなことがよくあります。

string = "My not so long string"
string[/so/] # gives so
string[/present/] # gives nil
string[/present/].nil? # gives true

したがって、文字列に部分文字列が含まれている場合は、単にこれをチェックとして使用できます

puts "found" if string[/so/]

より進んだが、まだ短く素早く:第2パラメータを使用して特定のグループを検索する。この例では番号2が1で0から始まるので、2はこの例では2番目で、グループはかっこで囲まれている。

string[/(n.t).+(l.ng)/, 2] # gives long

また、頻繁に使用されます:検索とsubまたはgsubで置き換え、 \1は最初に見つかったグループを与え、 \2は2番目:

string.gsub(/(n.t).+(l.ng)/, '\1 very \2') # My not very long string

最後の結果は記憶され、次の行で使用できます

$2 # gives long


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow