Ruby 代码重构以消除正则表达式的重复

Ruby 代码重构以消除正则表达式的重复,ruby,refactoring,Ruby,Refactoring,我编写了下面一段Ruby代码,用于从html页面提取信息 combined = state = county = special = 0 unless options.nil? unless /([0-9\.]+)% \(Combined\)/.match(options).nil? combined = /([0-9\.]+)% \(Combined\)/.match(options)[1].to_f end unless /([0-9\.]+

我编写了下面一段Ruby代码,用于从html页面提取信息

  combined = state = county = special = 0

  unless options.nil?

    unless /([0-9\.]+)% \(Combined\)/.match(options).nil?
      combined = /([0-9\.]+)% \(Combined\)/.match(options)[1].to_f
    end

    unless /([0-9\.]+)% \(State\)/.match(options).nil?
      state = /([0-9\.]+)% \(State\)/.match(options)[1].to_f
    end

    unless /([0-9\.]+)% \(County\)/.match(options).nil?
      county = /([0-9\.]+)% \(County\)/.match(options)[1].to_f
    end

    unless /([0-9\.]+)% \(Special\)/.match(options).nil?
      special = /([0-9\.]+)% \(Special\)/.match(options)[1].to_f
    end

    if combined==0 and state==0 and county==0 and special ==0 then
      unless />([0-9\.]+)%</.match(options).nil?
        combined = />([0-9\.]+)%</.match(options)[1].to_f
      end          
    end

  end
combined=state=country=special=0
除非选择。零?
除非/([0-9\.]+)%\(组合\)/.match(选项)。无?
组合=/([0-9\.]+)%\(组合\)/.match(选项)[1]。到
终止
除非/([0-9\.]+)%\(State\)/.match(options).nil?
状态=/([0-9\.]+)%\(状态\)/.match(选项)[1]。到
终止
除非/([0-9\.]+)%\(县\)/.match(选项)。无?
county=/([0-9\.]+)%\(county\)/.match(选项)[1]。至
终止
除非/([0-9\.]+)%\(特殊\)/.match(选项)。无?
特殊=/([0-9\.]+)%\(特殊\)/.match(选项)[1]。到
终止
如果组合==0,州==0,县==0,特殊==0,则

除非/>([0-9\.]+)%([0-9\.]+)%更新:相同的方法,但稍微清理了代码

results = Hash.new(0)
if options
  %w(Combined State County Special).each do |query|
    options =~ /([0-9\.]+)% \(#{query}\)/
    results[query.downcase.intern] = $1.to_f if $~
  end

  if results.values.all?(&:zero?)
    options =~ />([0-9\.]+)%</
    results[:combined] = $1.to_f if $~
  end
end
results=Hash.new(0)
如果选项
%w(州-县联合特价)。每个do |查询|
选项=~/([0-9\.]+)%\({query}\)/
结果[query.downcase.intern]=如果$~
终止
if results.values.all?(&:零?)

选项=~/>([0-9\.]+)%更新:相同的方法,但稍微清理了代码

results = Hash.new(0)
if options
  %w(Combined State County Special).each do |query|
    options =~ /([0-9\.]+)% \(#{query}\)/
    results[query.downcase.intern] = $1.to_f if $~
  end

  if results.values.all?(&:zero?)
    options =~ />([0-9\.]+)%</
    results[:combined] = $1.to_f if $~
  end
end
results=Hash.new(0)
如果选项
%w(州-县联合特价)。每个do |查询|
选项=~/([0-9\.]+)%\({query}\)/
结果[query.downcase.intern]=如果$~
终止
if results.values.all?(&:零?)
options=~/>([0-9\.]+)%
如果options.nil返回?
选项。扫描(/([0-9.]+)%\([\w]+)\)/)执行
个案2元
当“合并”时。冻结然后合并=$1.0
当“State”时,冻结然后State=$1.0
当“County”时。冻结,则County=$1.0
当“特殊”时。冻结然后特殊=$1.0
其他的
如果选项=~/>([0-9.]+)%,则组合=$1.0%
返回if options.nil?
选项。扫描(/([0-9.]+)%\([\w]+)\)/)执行
个案2元
当“合并”时。冻结然后合并=$1.0
当“State”时,冻结然后State=$1.0
当“County”时。冻结,则County=$1.0
当“特殊”时。冻结然后特殊=$1.0
其他的

如果选项=~/>([0-9.]+)%再次出现,则组合=1.0美元-回答得很好。我也可以问一下,为什么要用。在比赛中不要动琴弦?我意识到冻结使字符串不可变。这是一场表演胜利吗?还是一种向读者显示这些字符串是常量的方法?还是为了防止修改?这是为了性能。如果不冻结
,每次读取这部分代码时都会生成一个新的字符串实例,这是一种巨大的资源浪费<代码>冻结
以特殊方式处理字符串文字,使其只生成一次。@madcow为什么删除了答案?您的代码是干净的,并且产生了正确的结果。@sawa您的代码与我的代码的工作方式不同。与@Alik比较,编辑了答案。再次-伟大的答案。我也可以问一下,为什么要用。在比赛中不要动琴弦?我意识到冻结使字符串不可变。这是一场表演胜利吗?还是一种向读者显示这些字符串是常量的方法?还是为了防止修改?这是为了性能。如果不冻结
,每次读取这部分代码时都会生成一个新的字符串实例,这是一种巨大的资源浪费<代码>冻结
以特殊方式处理字符串文字,使其只生成一次。@madcow为什么删除了答案?您的代码是干净的,并且产生了正确的结果。@sawa您的代码与我的代码的工作方式不同。与@Alik比较,编辑了答案。