2013-03-30 116 views
2

我试图将字符串"[test| blah] [foo |bar][test|abc]"分为以下几阵:红宝石.split()正则表达式

[ 
    ["test","blah"] 
    ["foo","bar"] 
    ["test","abc"] 
] 

但我有麻烦我的正则表达式正确。


红宝石:

@test = '[test| blah] [foo |bar][test|abc]'.split(%r{\s*\]\s*\[\s*}) 
@test.each_with_index do |test, i| 
    @test[i] = test.split(%r{\s*\|\s*}) 
end 

我不能令人信服,这将返回:

[ 
    [ "[test" , "blah" ] 
    [ "foo" , "bar" ] 
    [ "test" , "abc]" ] 
] 

什么是正确的正则表达式来实现这一目标?这将是巨大的,如果我也可以考虑新的生产线,说:"[test| blah] \n [foo |bar]\n[test|abc]"

回答

8

最好使用String#scan此:

> "[test| blah] \n [foo |bar]\n[test|abc]".scan(/\[(.*?)\s*\|\s*(.*?)\]/) 
=> [["test", "blah"], ["foo", "bar"], ["test", "abc"]] 
+0

完美!谢谢 –

1

这里是另外一个例子:

'[test| blah] [foo |bar][test|abc]'.scan(/\w+/).each_slice(2).to_a 
#=> [["test", "blah"], ["foo", "bar"], ["test", "abc"]] 

"[test| blah] \n [foo |bar]\n[test|abc]".scan(/\w+/).each_slice(2).to_a 
#=> [["test", "blah"], ["foo", "bar"], ["test", "abc"]]