正则表达式" punct"字符范围会导致重复范围警告

时间:2015-09-02 13:28:18

标签: ruby-on-rails ruby regex rspec

我有一个简单的库,旨在为rails项目创建安全的slu .. RSpec测试如下所示:

RSpec.describe SlugSupport do
  it 'filters out punctuation' do
    expect(SlugSupport.slugify('`~!@#$%^&*()_+-={}|[]\:",./<>?:\'\/\\')).to be_nil
  end
end

,实现如下:

class SlugSupport
  def self.slugify str
    slug = str.to_s.downcase.strip
    tmp = slug.gsub(/[[:punct:]\s`$<>^|+=~]+/, '-').gsub(/^[-]+/, '')
    tmp.empty? ? nil : tmp
  end
end

通过此实施,测试可以正常进行,但会产生警告。

lib/slug_support.rb:8: warning: character class has duplicated range: /[[:punct:]\s`$<>^|+=~]+/

但是,当我从正则表达式

中删除其他字符时
slug.gsub(/[[:punct:]\s]+/, '-').gsub(/^[-]+/, '')

我没有收到任何警告,但测试失败了:

1) SlugSupport filters out punctuation
 Failure/Error: expect(SlugSupport.slugify('`~!@#$%^&*()_+-={}|[]\:",./<>?:\'\/\\')).to be_nil
   expected: nil
        got: "`~-$-^-+-=-|-<>-"
 # ./spec/lib/slug_support_spec.rb:12:in `block (2 levels) in <top (required)>'

从其他SO问题(例如Why does Ruby /[[:punct:]]/ miss some punctuation characters?),我认为[:punct]字符组对我的语言环境的行为正确。所以问题是:警告不正确吗?并且,如果警告不正确,堆栈的哪个部分会生成警告,RSpec,Rails或Ruby?

1 个答案:

答案 0 :(得分:1)

我在我的语言环境中没有收到警告,但我认为并非所有字符都在IBla[]中。只需删除那些;你可以使用这样的东西来弄清楚它们是:

[[:punct:]]