4

私はこの問題を解決できないようです、誰かが助けてくれることを願っています:

Nilfacsは、ハッシュから取得された文字列の配列です。

この行の場合:

looping_finaltext = finaltext.reject {|sentence| nilfacs.any? {|fac| sentence =~ /#{(fac)}/i}}

次のエラーが発生します:warning: character class has ']' without escape: /[[]]/ および block (2 levels) in <main>': premature end of char-class: /[[]]/i (RegexpError)

すべての文字列は(「条件」などの)通常の単語であり、エスケープする必要のある文字は含まれていません。

これは、予期しない何かが文字列として配列に供給されていることを示していますか?または、この行の構文に何か問題がありますか?

4

2 に答える 2

10

これは、予期しない何かが文字列として配列に供給されていることを示していますか?

はい、まさにそれです。ネストされた配列があり、そのどこかに空の配列の配列があり、[[]]そのto_s表現が見つけた結果を生成することを期待しています。

正規表現リテラルで補間を使用すると、ソース内の文字は正規表現内の文字と同じように扱われます。/b[/が有効な正規表現ではないのと同様に、foo="b["; bar=/#{foo}/は無効です。

nilfacs = [ "a[]", "b[", "c]", [[]] ]

nilfacs.each do |fac|
  begin
    p /#{fac}/
  rescue RegexpError=>e
    puts e
  end
end

#=> empty char-class: /a[]/
#=> premature end of char-class: /b[/
#=> /c]/
#=> warning: regular expression has ']' without escape: /[[]]/
#=> premature end of char-class: /[[]]/

文字列をリテラル文字として使用する場合は、次を使用しますRegexp.escape

nilfacs.each do |fac|
  p /#{Regexp.escape fac}/
end
#=> /a\[\]/
#=> /b\[/
#=> /c\]/

Regexp.unionまたは、配列から、その中のすべてのリテラル文字列に一致する単一の正規表現を作成するために使用することもできます。

rejects = %w[dog cat]
re = Regexp.new(Regexp.union(rejects).source,'i') #=> /dog|cat/i
looping_finaltext = finaltext.reject{ |sentence| sentence=~re }
于 2012-06-05T17:32:52.380 に答える
2

Nilfacsは、ハッシュから取得された文字列の配列です。

おそらくそうではありませんが、nilfacsほぼ確実に、メンバーとして空のAoAがあります。これを試してみると、次のように表示されirbます。

>> a = [[]]
>> /#{a}/
(irb):4: warning: character class has ']' without escape: /[[]]/
RegexpError: premature end of char-class: /[[]]/

それかあなたは文字列を持ってい'[[]]'ますnilfacs

>> a = '[[]]'
>> /#{a}/
(irb):6: warning: character class has ']' without escape: /[[]]/
RegexpError: premature end of char-class: /[[]]/

希望する文字列の配列になるように修正したらnilfacs、次の代わりに単一の正規表現を使用してコードをクリーンアップできますany?

re = Regexp.new(Regexp.union(nilfacs).source, Regexp::IGNORECASE)
looping_finaltext = finaltext.reject { |sentence| sentence =~ re }

正規表現エンジンは、すべてのパターンを一度にチェックして、ブロックString#=~内で何度も何度も呼び出すオーバーヘッドを回避できます。any?

于 2012-06-05T17:29:04.567 に答える