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 回答