2013-06-25 4 views
0

Я новичок в Ruby, и мне нужна помощь У меня есть образец часть .txtRuby: уникальный набор цифр

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"]` 

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

ответ

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

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

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

Спасибо! Это реально помогает мне в рядах. Можете ли вы дать мне совет о colomn of row? Я имею в виду теперь с uniq! Я могу найти уникальную строку. Но что, если у меня есть две строки с одинаковым набором цифр? И если эти наборы одинаковые, мне нужно только одну строку –

+0

Вы можете использовать 'uniq!' Для тех же: http://ruby-doc.org/core-2.0/Array.html#method-i-uniq –

+0

Как это '[[' пришел? –

2

Используйте набор вместо массива:

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"] 
Смежные вопросы