12

を使用してRuby 1.9.3います。私はいくつかのパターンで遊んでいて、興味深いものを見つけました:

例 1:

irb(main):001:0> /hay/ =~  'haystack'
=> 0
irb(main):003:0> /st/ =~ 'haystack'
=> 3

例 2:

irb(main):002:0> /hay/.match('haystack')
=> #<MatchData "hay">
irb(main):004:0> /st/.match('haystack')
=> #<MatchData "st">

=~最初に一致した最初の位置をmatch返し、パターンを返します。それ以外に、 と の間=~に違いはありmatch()ますか?

実行時間の差 (@Casper による)

irb(main):005:0> quickbm(10000000) { "foobar" =~ /foo/ }
Rehearsal ------------------------------------
   8.530000   0.000000   8.530000 (  8.528367)
--------------------------- total: 8.530000sec

       user     system      total        real
   8.450000   0.000000   8.450000 (  8.451939)
=> nil

irb(main):006:0> quickbm(10000000) { "foobar".match(/foo/) }
Rehearsal ------------------------------------
  15.360000   0.000000  15.360000 ( 15.363360)
-------------------------- total: 15.360000sec

       user     system      total        real
  15.240000   0.010000  15.250000 ( 15.250471)
=> nil
4

2 に答える 2

10

まず、正しい演算子を使用していることを確認してください。正しいです=~が、そうで~=はありません。

演算子=~は最初の一致のインデックスを返し(一致しない場合) 、をグローバル変数にnil格納します。名前付きキャプチャグループは、のハッシュに割り当てられ、演算子の左側にあるリテラルの場合は、それらの名前のローカル変数にも割り当てられます。MatchData$~$~RegExp

>> str = "Here is a string"
>> re = /(?<vowel>[aeiou])/    # Contains capture group named "vowel"
>> str =~ re
=> 1
>> $~
=> #<MatchData "e" vowel:"e">
>> $~[:vowel]    # Accessible using symbol...
=> "e"
>> $~["vowel"]    # ...or string
=> "e"
>> /(?<s_word>\ss\w*)/ =~ str
=> 9
>> s_word # This was assigned to a local variable
=> " string"

メソッドはそれ自体をmatch返します(これも一致しない場合)。この場合、メソッド呼び出しのいずれかの側にある名前付きキャプチャグループは、返されたのハッシュに割り当てられます。MatchDatanilMatchData

>> m = str.match re
=> #<MatchData "e" vowel:"e">
>> m[:vowel]
=> "e"

詳細については、 http://www.ruby-doc.org/core-1.9.3/Regexp.html(およびのセクションMatchDataString)を参照してください。

于 2013-01-15T18:21:44.290 に答える
4

状態を変更しないメソッドがある場合、重要なのは戻り値だけです。では、色以外に、赤と青の違いは何ですか?私の言いたいことは、これは一種の奇妙な質問であり、あなたはすでに答えを知っているようです。(@sawaは私をここにまっすぐに設定しました)

nilただし、正規表現が一致しない場合は、両方のメソッドが(偽の値)を返します。また、どちらのメソッドも、一致した場合に真の値を返します。=~一致の最初の文字を表す整数を返します。それがであっても、Rubyでは真実で 0あるためです。非常に詳細な一致データを含むオブジェクトを返します。これは、一致に関する多くの情報が必要な場合に便利です。0match

=~何かが一致するかどうかだけを気にする場合、通常は条件文で使用されます。

do_stuff if "foobar" =~ /foo/
do_stuff if "foobar".match(/foo/) # same effect, but probably slower and harder to read

match通常、一致したものの詳細が必要な場合に使用されます。

 name = "name:bob".match(/^name:(\w+)$/)[1]
 puts name #=> 'bob'
于 2013-01-15T18:22:13.313 に答える