2

可能重复:
将字符串拆分为列表,但保留拆分模式

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

4 回答 4

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"] 
于 2012-09-10T19:53:36.133 回答
0
"hello world, I am the universe".split(/,\s(?=I\sam)/,2)

这真的是你要找的吗?

于 2012-09-10T14:14:28.620 回答
0

你说这不是@pwned 链接到的问题的重复,但它有点。你只需要稍微摆弄一下Ruby。

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

我确信有一种更清洁的方法可以做到这一点,我会在发现更简单的方法后更新答案。

于 2012-09-10T16:21:29.960 回答
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"]
于 2012-09-10T20:33:45.033 回答