2016-07-20 8 views
4

私はルビーの正規表現の学習を始めました。そこに私は1つの問題があった。問題は以下の正規表現が期待どおりに動作しないことです。例えばなぜこの正規表現がルビで真になるのですか?

/^[\s]*$/ -- This will match only if the input contains white spaces or the input contains empty. 

str = "  

     abc 

      " 
if str =~ /^[\s]*$/ 
     puts "Condition is true" 
else 
     puts "Condition is false" 
end 

私の期待は意志が偽なる。この状態です。しかしそれは事実になる。どうしてか分かりません ?

sedまたはgrepでは、期待どおりに動作します。しかし、それがルビーではうまくいかない理由。

答えて

4

理由は、Rubyの正規表現、^$一致ラインの開始/終了します。 \A\zに変更すると、falseという結果になります。

this Ruby demo at Ideoneを参照してください。 /\A\s*\z/は、文字列にのみ一致するか、または空白記号のみを含みます。

\sは、[ \t\n]の代わりに[ \t\r\n\f]の同義語です。

/\s/ - 空白文字:このRuby Character Class referenceを参照してください。本当だ/[ \t\r\n\f]/

+0

と苛立ちの実際のソースを実際の問題ではなく、\のS' 'の' [\ s]は 'です。 – cremno

+0

@cremno: '[\ s *]'はどこにありますか?私はポストの歴史をチェックしました、OPはそのパターンを持っていませんでした。何か他のことを説明する必要がある場合、またはすべてが明白である場合はお知らせください。 –

+0

ちょうどタイプミス。 grepとsedは行ベースです。 '^'/'$'はRubyと同じように動作します。しかしgrepの '[\ s]'はRubyの '[\\ s]'と同じです。 – cremno

関連する問題