1

この問題を説明するRubyコードは次のとおりです。

1.8.7 :018 > pattern[:key] = '554 5.7.1.*Service unavailable; Helo command .* blocked using'
 => "554 5.7.1.*Service unavailable; Helo command .* blocked using" 
1.8.7 :019 > line = '554 5.7.1 Service unavailable; Helo command [abc] blocked using dbl'
 => "554 5.7.1 Service unavailable; Helo command [abc] blocked using dbl" 
1.8.7 :020 > line =~ /554 5.7.1.*Service unavailable; Helo command .* blocked using/
 => 0 
1.8.7 :021 > line =~ /pattern[:key]/
 => nil 
1.8.7 :022 > 

正規表現は、文字列として直接使用する場合は機能しますが、ハッシュの値として使用する場合は機能しません。

4

2 に答える 2

2
line =~ /#{pattern[:key]}/

また...

line =~  Regexp.new pattern[:key]

正規表現の特殊文字をエスケープしたい場合...

line =~ /#{Regexp.quote pattern[:key]}/

編集:あなたはルビーに慣れていないので、pattern定義されている場所ならどこでもこれを行うことをお勧めします:

pattern[:key] = Regexp.new '554 5.7.1.*Service unavailable; Helo command .* blocked using'

Regexp次に、に格納されているオブジェクトを簡単に使用できますpattern

line =~ pattern[:key]
于 2013-01-04T05:15:03.787 に答える
2

これは Ruby に関する質問ではありません。目的を達成する正規表現パターンを構築する方法です。

「regex-ese」では、次の/pattern[:key]/ことを意味します。

  1. 検索しますpattern
  2. 、、またはのいずれかpatternを探します。:key

Ruby は、Perl のように文字列や正規表現パターンの変数を自動的に補間しません。そのため、代わりに、変数が#{...}インラインを使用している場所をマークする必要があります。

パターンとしてのみ使用/pattern[:key]/している場合は、わざわざパターンに補間しないでください。代わりに、直接パスを取り、Regexp に任せます。

pattern[:key] = 'foo'
Regexp.new(pattern[:key])
=> /foo/

これは次と同じ結果です:

/#{pattern[:key]}/
=> /foo/

ただし、CPU サイクルを無駄にしません。

.パターンの予約文字である、[およびを使用した別の試みは]、パターンの定義を支援するために使用されました。そのような文字を使用する必要がある場合は、Rubyにエスケープ文字を適切にRegexp.escape追加\させて、文字列内での通常/文字通りの意味を維持することができます。

Regexp.escape('5.7.1 [abc]')
=> "5\\.7\\.1\\ \\[abc\\]"

これは、実際には"5\.7\.1\ \[abc\]"(IRBに表示されていない場合)

それを正規表現で使用するには、次を使用します。

Regexp.new(Regexp.escape('5.7.1 [abc]'))
=> /5\.7\.1\ \[abc\]/
于 2013-01-04T05:33:18.360 に答える