Рубин: уникальный набор цифр
Я новичок в 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"]