Просто указать на то, что с помощью регулярных выражений, не самый быстрый путь к достижению этой цели:
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 вы отфильтровываете те, которые не должны приниматься. Не пытайтесь делать все это в регулярном выражении, потому что вы создадите шаблон, который станет слишком громоздким и станет кошмаром для обслуживания.
Я не уверен на 100%, что ваше окончательное решение проблемы лучше всего решить с помощью регулярного выражения. Вы также не указываете, должна ли перестановка содержать * все * слова; если это так, возможно, достаточно три '[foo | bar | baz] +' предложения. Но действительно ли это конечная цель? Или вы пытаетесь выполнить поиск/сопоставление нечеткого текста? –
должно ли это регулярное выражение 'ruby ruby ruby' и другие перестановки вроде этого? –
@Dave Newton: нужно переставить подстановку, начиная с тех, которые содержат все слова ..., и в конечном итоге унизится с меньшим количеством совпадений. Последний resoult может соответствовать только одному слову –