Ruby:唯一的数字集

时间:2013-06-25 11:59:04

标签: ruby-on-rails ruby digits

我是Ruby的新手,我需要帮助 我有一个.txt的样本部分

Modified : /Analitics/Documents/HTZ/BR-5545 Credit/Example BR-5545.docx
Modified : /Analitics/Documents/HTZ/BR-5545 Credit/HTZ BR-5545 Example.docx

我只需找到行中的数字,只需一次。 (仅出现一次的唯一数字组) 使用regexp我找到数字

line=~/(BR-\d*)/
my=line.scan(/(BR-\d*)/)

输出:

`[["BR-5545"], ["BR-5545"]]`

但我需要一次:

`[["BR-5545"]`

请帮助我如何转换我的正则表达式

3 个答案:

答案 0 :(得分:3)

扫描后只需添加uniq!

data = "Modified : /Analitics/Documents/HTZ/BR-5545 Credit/Example BR-5545.docx"
data.scan(/(BR-\d*)/).uniq! # [["BR-5545"]

答案 1 :(得分:2)

使用Set而不是数组:

require 'set'
lines=[
    'Modified : /Analitics/Documents/HTZ/BR-5545 Credit/Example BR-5545.docx',
    'Modified : /Analitics/Documents/HTZ/BR-5545 Credit/HTZ BR-5545 Example.docx'
]

lines.inject(Set.new) {|s, l| s.merge(l.scan(/BR-\d+/)); s}
# => #<Set: {"BR-5545"}>

# or as an array
lines.inject(Set.new) {|s, l| s.merge(l.scan(/BR-\d+/)); s}.to_a
# => ["BR-5545"]

答案 2 :(得分:1)

给出input.txt这样的文件:

Modified : /Analitics/Documents/HTZ/BR-5545 Credit/Example BR-5545.docx
Modified : /Analitics/Documents/HTZ/BR-5545 Credit/HTZ BR-5545 Example.docx

你可以用这个

获得你想要的东西
File.open('input.txt').inject([]) do |array, line|
  array << line.scan(/(BR-\d*)/)
end.flatten.uniq

基本上:

  • 我们打开文件
  • 我们开始将迭代结果注入array变量,该变量初始化为[]
  • 我们扫描每一行以获得所需的正则表达式
  • 收集完所有结果后,我们将它展平,以便我们有一维数组
  • 然后我们调用uniq来删除重复项