Рубин: уникальный набор цифр

Я новичок в 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"]`

Пожалуйста, помогите мне, как преобразовать мое регулярное выражение

3 ответа

Решение

Учитывая 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 на него, чтобы удалить дубликаты

Просто добавь uniq! после сканирования:

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

Используйте 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"]
Другие вопросы по тегам