2017-06-30 81 views
0

我想要一個正則表達式匹配由空格分隔的句子中的所有詞組(單個詞和子句)。匹配詞組

例子:

"foo bar bar2".scan(regexp) 

我想regexp將返回:

['foo', 'bar', 'bar2', 'foo bar', 'bar bar2', 'foo bar bar2'] 

到目前爲止,我想:

"foo bar bar2".scan(/\S*[\S]/)(即regexp=/\S*/) 返回['foo', 'bar', 'bar2']

"foo bar bar2".scan(/\S* [\S]+/)(即regexp=/\S* [\S]+/) 返回["foo bar", " bar2"]

+0

但你想要的正則表達式也返回非組(單字) –

+0

@SergioTulentsev是的,我想要單個單詞和子句 –

+0

不能用一個正則表達式來完成。你最好的選擇是掃描單詞,然後按照你的意願將它們組合成子句。 –

回答

3
words = "foo bar bar2".scan(/\S+/) 
result = 1.upto(words.length).map do |n| 
    words.each_cons(n).to_a 
end.flatten(1) 
#⇒ [["foo"], ["bar"], ["bar2"], 
# ["foo", "bar"], ["bar", "bar2"], 
# ["foo", "bar", "bar2"]] 

result.map { |e| e.join(' ') } 
#⇒ ["foo", "bar", "bar2", "foo bar", "bar bar2", "foo bar bar2"] 

這裏我們使用Enumerable#each_cons去的結果。

+0

提供一些代碼解釋會很好。只有代碼答案經常會讓其他人發佈後續問題。 –

+0

@WiktorStribiżew老實說,我不確定這個答案如何用簡單的英語解釋變得更好。關鍵是'Enumerable#each_cons',就是這樣。 – mudasobwa

+0

然後看[這裏](https://ideone.com/5K5K3T)。產出不像預期的那樣。 –

0

Mudasobwa對此問題做了很好的變化check here。 我用聯合,內置數組的方法。該過程幾乎是相同的:

string = "foo bar bar2" 
    groups = string.split 
    objects = [] 

     for i in 1..groups.size 
     groups = string.split.combination(i).to_a 
     objects << groups 
     end 

    results = objects.flatten(1).map { |e| e.join('-') } 
    puts results 

無論如何,你不能用一個正則表達式做(假設你有50個字,需要找到所有的組合;正則無法做到這一點)。你將需要迭代像Mudasobwa所展示的對象。

我會開始這樣做:正則表達式,如果你想使用一個,可以是/([^ \ s] \ w +)/ m;例如。 這個正則表達式會匹配單詞。我的意思是指被白色空間包圍的羣體。

使用此功能,您可以掃描文本或分割字符串。你可以用很多方式做到這一點,最後你會得到一個你想要結合的單詞。

string = "foo bar bar2" 

然後你分割它,創建一個數組並應用它的組合方法。

groups = string.split 
    => ["foo", "bar", "bar2"] 

組合方法將一個數字作爲參數,該數字將是組合的「大小」。組合(2)將兩個元素組合在一起。 1 - 1組0組! (這就是我們開始與1組合的原因)。

您需要循環並覆蓋所有可能的組大小,將結果 保存在結果數組中。 :

objects = [] 

使用元素作爲參數來循環

 for i in 1..groups.size 
     groups = string.split.combination(i).to_a 
     objects << groups 
     end 

現在你只需要使用一個循環來完成扁平化是內部數組的數組,並採取了昏迷和雙數引號

results = objects.flatten(1).map {| e | e.join(' - ')}

那就是它!您可以運行上述這裏https://repl.it/JLK9/1

PS(例如更多的字)的代碼:兩問題和所提的答案是缺乏組合(FOO-BAR2)

+0

Thx,組合存在問題。它會給我所有的單詞組合,即使沒有在句子中跟隨他們自己的單詞。在我的例子中,我會得到我不想要的「foo bar2」。 –