2013-03-30 5 views
2

Я пытаюсь разделить строку "[test| blah] [foo |bar][test|abc]" в следующий массив:Рубин .split() Regular Expression

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

Но я есть проблемы с получением мое регулярное выражение правильно.


Ruby:

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