2012-01-23 33 views
0

と文字列のすべての単語の順列をマッチング:は、私は言葉の文字列をしましたRubyの正規表現

string = "Ruby web framework" 

は、どのように私はすべての可能な単語の順列に合致する正規表現を書くことができますか?

すべての次の文字列が一致する必要があります:

ruby web framework 
web framework ruby 
framework ruby web 

ruby framework web 
framework web ruby 
web ruby framework 
+3

私は100%があなたの究極の問題文が最良の正規表現で解決されて確信していません。また、置換が*すべての*単語を含んでいなければならないと述べていません。もしそうなら、3つの '[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"]] 

ため息... OK ...ここで私はそれを行うだろうかです:

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

ruby​​'が、その後、私は指定されたテキストを持つ任意の配列(またはその一部)を一致させるために何かを必要としています。私は、単語の組み合わせが与えられたフレーズに存在するかどうかをチェックするために、正規表現を求めそうでないと... –

+0

@ LucaG.Soave、私はあなたのためにそれを打ち砕いた。 –

+0

印象的な.... –

1

これは動作します:

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

生成された正規表現は/(ruby|web|development){3}/です。これは、あなたの望むことですか?ただ、正規表現を使用すると、この目標への最速のパスではないことを指摘する

+0

「この(5月)の作品」?あなたはそれを試してみてください?あなたはOPに結果を表示することができたのですか? –

+0

私は私が編集しましょう。それを試してみました。 – Linuxios

+1

はありませんこの試合 'ルビールビーはまた、偉大な? – daramarak

関連する問題