Сопоставление всех перестановок слов строки с регулярным выражением Ruby - PullRequest
0 голосов
/ 23 января 2012

У меня есть строка слов:

string = "Ruby web framework"

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

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

ruby web framework
web framework ruby
framework ruby web

ruby framework web
framework web ruby
web ruby framework 

Ответы [ 2 ]

4 голосов
/ 23 января 2012

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

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

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

1 голос
/ 23 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...