2012-09-10 78 views
1

可能重複:
Split string into a list, but keeping the split pattern紅寶石字符串分區

"hello world, I am the universe".partition(/I am/) 
    #=> ["hello world, ", "I am", " the universe"] 

什麼是具有此輸出的紅寶石呢?請記住更復雜的字符串。

#=> ["hello world, ", "I am the universe"] 

複雜:

"hello world, I am the universe, I am the world".some_partitioning_function(/I am/) 
#=>["hello world, ", "I am the universe, ", "I am the world"] 
+0

你是什麼意思的「分區」? – waldrumpus

+1

你能否擴展你的問題,特別是「更復雜的字符串」部分?這將有助於查看更多示例,每個示例都具有輸入字符串和期望的輸出數組。 –

+0

增加了一個更復雜的例子。 –

回答

1

方法不存在嗎?添加您自己:

class String 
    def some_partitioning_function(delim_str) 
    split(delim_str).map.with_index do |str, i| 
     i > 0 ? delim_str + str : str 
    end 
    end 
end 

"hello world, I am the universe, I am the world".some_partitioning_function('I am') 

=> ["hello world, ", "I am the universe, ", "I am the world"] 
0
"hello world, I am the universe".split(/,\s(?=I\sam)/,2) 

難道真的是你要找的東西?

+0

已經嘗試過:'[「hello world,」,「the universe」]' –

+0

我做了4次嘗試,沒有一次是你'重新尋找。我現在就放棄,而不是我的一天。 – Anton

+0

@Anton,現在問題中還有另外一個例子,如果有幫助的話。 –

0

你說這不是the question的重複@pwned鏈接到,但它的種類是。你只需要稍微擺弄紅寶石。

s = "hello world, I am the universe, I am the world" # original string 
a = s.split(/(I am)/) 
#=> ["hello world, ", "I am", " the universe, ", "I am, " the world"] 

現在我們將使用上述鏈接SO問題中提出的解決方案。除了我們將跳過數組的第一個元素。

sliced = a[1..-1].each_slice(2).map(&:join) 
#=> ["I am the universe, ", "I am the world"] 

現在我們將它與我們遺漏的數組元素結合起來。

final = [a[0]] + sliced 
#=> ["hello world, ", "I am the universe, ", "I am the world"] 

扔到等的方法是:

class String 
    def split_and_include(words) 
    s = self.split(/(#{words})/) 
    [s[0]] + s[1..-1].each_slice(2).map(&:join) 
    end 
end 

"You all everybody. You all everybody.".split_and_include("all") 
#=> ["You ", "all everybody. You ", "all everybody."] 

我敢肯定有這樣做的更清潔的方式,我會在發現更簡單的方法更新了答案。

0

我想這個任務應該由正則表達式來解決,我的正則表達式是不那麼整齊,也許你以後可以修復它。

reg = /(.+?(?=I\sam))(I\sam.+?(?=I\sam)|I\sam.+$)/ 
str = "hello world, I am the universe, I am the world, I am the earth" 

str.scan(reg).flatten 
=> ["hello world, ", "I am the universe, ", "I am the world, ", "I am the earth"]