2012-11-11 11 views
11

Ruby regexpにはいくつかのオプションがあります(例:ixmo)。 iは、たとえば、大文字小文字を無視することを意味します。regexpのo修飾子は何を意味しますか?

oオプションの意味は? ri Regexpでは、o#{}補間を1回だけ実行することを意味します。私はこれを行うときには:

a = 'one' 
b = /#{a}/ 
a = 'two' 

bは、(それが/one/のまま)は変更されません。私は何が欠けていますか? the go-to source for regular expressionsからストレート

+0

正規表現で 'o'フラグを使用していません。なぜあなたはそれの効果を期待していますか? – sawa

+0

'o'フラグを使うと、エフェクトをオンにすると、正規表現中の'#{} 'は毎回フラグなしで実行されます –

+0

Perl(Rubyではなく)のドキュメントhttp:// perldoc.perl.org/perlre.htmlあなたのコードを最適化しようとするが、実際にはバグを導入するという、 'o'修飾子について述べられています。だからPerlでは、 'o'フラグはRubyとは異なる意味を持ち、さらにPerlフラグが壊れている可能性があります。 – Rhubbarb

答えて

19

は:

/oは一度だけ、それが評価される最初の時間行うことがリテラル特定の正規表現の任意#{...}置換を引き起こします。それ以外の場合は、リテラルがRegexpオブジェクトを生成するたびに置換が実行されます。

私もthis usage exampleを上げることができます:

# avoid interpolating patterns like this if the pattern 
# isn't going to change: 
pattern = ARGV.shift 
ARGF.each do |line| 
    print line if line =~ /#{pattern}/ 
end 

# the above creates a new regex each iteration. Instead, 
# use the /o modifier so the regex is compiled only once 

pattern = ARGV.shift 
ARGF.each do |line| 
    print line if line =~ /#{pattern}/o 
end 

だから私は、これは複数回実行される単一ラインのために、むしろコンパイラのためのものであると思います。

+1

ちょっと前に「評価戦略」に関するwikiを読んだので、やっと分かりました。ルビでは、割当てが熱心に評価されるので、 'b = /#{a} /'の後に '/ one /'に 'b 'を代入すると' flag ' –

+0

この回答は[Modifier]の[Stack Overflow Regular Expression FAQ](http://stackoverflow.com/a/22944075/2736496)に追加されました。 – aliteralmind

関連する問題