2013-02-28 7 views
-2

У меня есть вектор в Ruby, как этотрубин поиск строки по шаблону в массиве

a = ['.rc', '.res', 'file1.rb'] 

я хотел бы сравнить строку «» filex.rc с этим вектором и сопоставить их. Я хотел бы сопоставить их, потому что они имеют одинаковый шаблон (имя завершено с .rc).

Еще один пример: если я ищу строку «1234.res», сравнение вернет true по сравнению с моим вектором, но если я сравню «123file1.rb», сравнение должно вернуть false. Это похоже на регулярное выражение, которое мне нравится сравнивать некоторые шаблоны в моем векторе с некоторыми строками в моем тексте.

Итак, как я могу написать код в Ruby, который может сделать это для меня?

Надеюсь, что в моем вопросе был ясен. Спасибо всем за любую помощь.

+3

Какой тип элементов? Ваш текущий пример - синтаксическая ошибка. – Linuxios

+0

Элементы в векторе являются строками, но я не уверен, являются ли они правильным типом для использования, может быть, мы можем использовать/regex /? Вы можете сделать некоторые предложения, если хотите. :) –

ответ

1

Существует логический разрыв: вы молчаливо предполагали, что шаблоны должны быть сопоставлены, если они встречаются при t он заканчивается указанными строками и не подбирается, если они находятся в середине/начале. Думаю, вы не хотите соответствовать file1.rb.orig против file1.rb, не так ли?

Итак, если вы хотите использовать настоящие регулярные выражения, вы заново определить свой список соответствия с:

a = ['*.rc', '*.res', 'file1.rb'] 

Если вы хотите file1.rb~ матча против ваших a моделей, оставить его нетронутым.

Теперь мы можем написать:

a.map { |m| m.gsub('*', '(.*)') }.reject { |m| (Regexp.new(m) =~ 'testfile.rc').nil? } 

возвращает все матчи, поэтому, если возвращаемый массив не пустой вы преуспеете в соответствие.

+0

Спасибо. Это решение - это более приблизительное, что я хочу. Это еще не идеально, я поймал некоторые случаи, которые не работают. Но в любом случае, спасибо за поддержку. Было полезно! –

+0

Добро пожаловать. Поскольку я понятия не имел, что такое фактические случаи, я просто предоставил скелет для реального решения. – mudasobwa

1

Учитывая описанные вами варианты использования, я изменяю следующий шаблон 'file1.rb' на '^file1.rb$'. Таким образом, мы можем работать с истинными регулярными выражениями.

Первое преобразование его в массив регулярных выражений:

patterns = a.map { |element| Regexp.new element } 

Затем построить одно регулярное выражение, которое является объединением всех регулярных выражений:

re = Regexp.union(patterns) 

Затем вы можете сопоставить вашу строку с ним

'filex.rc'.match re 
=> #<MatchData ".rc"> 

'123file1.rb'.match r 
=> #<MatchData "file1.rb"> 

'123file1.rb'.match r 
=> nil