2012-01-23 4 views
0

Я строку слов:Matching все слова перестановки строки с Ruby-Regular Expression

string = "Ruby web framework" 

Как я могу написать регулярное выражение соответствия все возможные слова перестановку?

Все следующие строки должны соответствовать:

ruby web framework 
web framework ruby 
framework ruby web 

ruby framework web 
framework web ruby 
web ruby framework 
+3

Я не уверен на 100%, что ваше окончательное решение проблемы лучше всего решить с помощью регулярного выражения. Вы также не указываете, должна ли перестановка содержать * все * слова; если это так, возможно, достаточно три '[foo | bar | baz] +' предложения. Но действительно ли это конечная цель? Или вы пытаетесь выполнить поиск/сопоставление нечеткого текста? –

+1

должно ли это регулярное выражение 'ruby ruby ​​ruby' и другие перестановки вроде этого? –

+0

@Dave Newton: нужно переставить подстановку, начиная с тех, которые содержат все слова ..., и в конечном итоге унизится с меньшим количеством совпадений. Последний resoult может соответствовать только одному слову –

ответ

4

Просто указать на то, что с помощью регулярных выражений, не самый быстрый путь к достижению этой цели:

pp string.split.permutation.to_a 

[["Ruby", "web", "framework"], 
["Ruby", "framework", "web"], 
["web", "Ruby", "framework"], 
["web", "framework", "Ruby"], 
["framework", "Ruby", "web"], 
["framework", "web", "Ruby"]] 

Вздох ... ОК ... вот как я бы это сделать:

require 'pp' 

string = "Ruby web framework" 
strings_to_search = string.split.permutation.map{ |p| 'Lorem, ' + p.join(' ') + ' consectetur'} 

strings_to_search << 'Lorem, Ruby consectetur' 
strings_to_search << 'Lorem, Ruby web consectetur' 
strings_to_search << 'Lorem, Ruby Ruby Ruby' 

pp strings_to_search.map{ |p| p.scan(Regexp.union(string.split)) } 

И что происходит:

1.9.2-p290 :001 >  require 'pp' 
true 
1.9.2-p290 :002 > 
1.9.2-p290 :003 >  string = "Ruby web framework" 
"Ruby web framework" 
1.9.2-p290 :004 >  strings_to_search = string.split.permutation.map{ |p| 'Lorem, ' + p.join(' ') + ' consectetur'} 
[ 
    [0] "Lorem, Ruby web framework consectetur", 
    [1] "Lorem, Ruby framework web consectetur", 
    [2] "Lorem, web Ruby framework consectetur", 
    [3] "Lorem, web framework Ruby consectetur", 
    [4] "Lorem, framework Ruby web consectetur", 
    [5] "Lorem, framework web Ruby consectetur" 
] 
1.9.2-p290 :005 > 
1.9.2-p290 :006 >  strings_to_search << 'Lorem, Ruby consectetur' 
[ 
    [0] "Lorem, Ruby web framework consectetur", 
    [1] "Lorem, Ruby framework web consectetur", 
    [2] "Lorem, web Ruby framework consectetur", 
    [3] "Lorem, web framework Ruby consectetur", 
    [4] "Lorem, framework Ruby web consectetur", 
    [5] "Lorem, framework web Ruby consectetur", 
    [6] "Lorem, Ruby consectetur" 
] 
1.9.2-p290 :007 >  strings_to_search << 'Lorem, Ruby web consectetur' 
[ 
    [0] "Lorem, Ruby web framework consectetur", 
    [1] "Lorem, Ruby framework web consectetur", 
    [2] "Lorem, web Ruby framework consectetur", 
    [3] "Lorem, web framework Ruby consectetur", 
    [4] "Lorem, framework Ruby web consectetur", 
    [5] "Lorem, framework web Ruby consectetur", 
    [6] "Lorem, Ruby consectetur", 
    [7] "Lorem, Ruby web consectetur" 
] 
1.9.2-p290 :008 >  strings_to_search << 'Lorem, Ruby Ruby Ruby' 
[ 
    [0] "Lorem, Ruby web framework consectetur", 
    [1] "Lorem, Ruby framework web consectetur", 
    [2] "Lorem, web Ruby framework consectetur", 
    [3] "Lorem, web framework Ruby consectetur", 
    [4] "Lorem, framework Ruby web consectetur", 
    [5] "Lorem, framework web Ruby consectetur", 
    [6] "Lorem, Ruby consectetur", 
    [7] "Lorem, Ruby web consectetur", 
    [8] "Lorem, Ruby Ruby Ruby" 
] 
1.9.2-p290 :009 > 
1.9.2-p290 :010 >  pp strings_to_search.map{ |p| p.scan(Regexp.union(string.split)) } 
[["Ruby", "web", "framework"], 
["Ruby", "framework", "web"], 
["web", "Ruby", "framework"], 
["web", "framework", "Ruby"], 
["framework", "Ruby", "web"], 
["framework", "web", "Ruby"], 
["Ruby"], 
["Ruby", "web"], 
["Ruby", "Ruby", "Ruby"]] 
[ 
    [0] [ 
     [0] "Ruby", 
     [1] "web", 
     [2] "framework" 
    ], 
    [1] [ 
     [0] "Ruby", 
     [1] "framework", 
     [2] "web" 
    ], 
    [2] [ 
     [0] "web", 
     [1] "Ruby", 
     [2] "framework" 
    ], 
    [3] [ 
     [0] "web", 
     [1] "framework", 
     [2] "Ruby" 
    ], 
    [4] [ 
     [0] "framework", 
     [1] "Ruby", 
     [2] "web" 
    ], 
    [5] [ 
     [0] "framework", 
     [1] "web", 
     [2] "Ruby" 
    ], 
    [6] [ 
     [0] "Ruby" 
    ], 
    [7] [ 
     [0] "Ruby", 
     [1] "web" 
    ], 
    [8] [ 
     [0] "Ruby", 
     [1] "Ruby", 
     [2] "Ruby" 
    ] 
] 

После того, как у вас есть хиты, THEN вы отфильтровываете те, которые не должны приниматься. Не пытайтесь делать все это в регулярном выражении, потому что вы создадите шаблон, который станет слишком громоздким и станет кошмаром для обслуживания.

+0

отлично, но тогда мне нужно что-то, чтобы соответствовать любому массиву (или его части) с заданным текстом. Я попросил регулярное выражение, чтобы проверить, существует ли комбинация слов в данной фразе или нет ... –

+0

@ LucaG.Soave, я сломал это для вас. –

+0

впечатляет .... –

1

Это работает:

theRegex=Regexp.new("("+(Regexp.union(str.split(' ')).inspect.chop[1..-1])+"){#{str.split(' ').length}}") 

Сформированный регулярное выражение /(ruby|web|development){3}/. Это то, что вы хотите?

+0

«Это (может) работать»? У вас есть возможность попробовать? Вы можете показать результаты в OP? –

+0

Я попробовал, я отредактирую. – Linuxios

+1

Не будет этот матч 'ruby ruby ​​ruby' тоже? – daramarak

Смежные вопросы