0

我是 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

我只需要在行中找到数字,而且只需要一次。(仅出现一次的唯一数字集)使用正则表达式我找到数字

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

输出:

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

但我需要一次:

`[["BR-5545"]`

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

4

3 回答 3

3

uniq!扫描后添加:

data = "Modified : /Analitics/Documents/HTZ/BR-5545 Credit/Example BR-5545.docx"
data.scan(/(BR-\d*)/).uniq! # [["BR-5545"]
于 2013-06-25T12:10:57.270 回答
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"]
于 2013-06-25T17:09:37.127 回答
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 以删除重复项
于 2013-06-25T12:31:00.707 回答