2010-11-23 10 views
7

Ruby 1.8.7。私は文字列の先頭にパターンをマッチさせるために^で正規表現を使用しています。問題は、パターンがの先頭に見つかった場合は、文字列内の任意の行が一致することです。これは私が「M」修飾子を使用していた場合、私が期待する動作ですが、私はないよ:Rubyの正規表現:^ m修飾子がない場合でも行頭に一致しますか?

$ irb 
irb(main):001:0> str = "hello\ngoodbye" 
=> "hello\ngoodbye" 
irb(main):002:0> puts str 
hello 
goodbye 
=> nil 
irb(main):004:0> str =~ /^goodbye/ 
=> 6 

は、私がここで間違って何をしているのですか?

+4

偉大なリソース... http://rubular.com/ –

答えて

1

"^"は行の先頭です。あなたが望むものを作るために、文字列を分割して最初の行だけをテストすることができます。しかし、私はもっと良い方法があると思います。ラインの

str.split("\n")[0] =~ /^hello/ 
17
  • 開始:ラインの^
  • 終了:文字列の$
  • 開始:\ Z
7

あなたの混乱が正当化されます。ほとんどの正規表現のフレーバーでは、^\Aに相当し、$はデフォルトで\Zに相当し、 "multiline"フラグを設定して他の意味(行境界)にする必要があります。 Rubyでは、^$常には行の境界で一致します。

Rubyには「マルチライン」モードと呼ばれるものがありますが、実際には「シングルライン」モードまたは「DOTALL」モードと呼ばれています。.メタ文字の意味を変更し、 (例えば、\r,\n)と他のすべての文字と一致する行区切り文字。

+0

あなたはどのような正規表現の味を表現していますか? –

+0

@Wayne:Perl、PHP、Python、JavaScript、Java、.NETなどの他のPerl派生のフレーバーは、そのように機能します: "マルチライン"モードを持つ場合、 '$'は "行末"になります。私はRubyのアプローチが間違っていると言っているわけではありません。私はちょうど彼らがしたように名前を混同していないことを望む。 Perl 6/Parrotは、 "multiline" *と* "single-line"モードを排除する唯一の味です。 –

+0

はい、Rubyが\ Aと同じ方法で^を使うCとPerlで正規表現するのに慣れています。私はC regexライブラリが '決定的な'ものだと思っていました - 私は間違っていました。あなたの答えをありがとう。 – SteveRawlinson

関連する問題