2014-03-12 74 views
1

我無法找出解析特定字符串集合的最佳方法。具有可變選項的紅寶石正則表達式

字符串的一些例子我會翻過是:

str = 'name[key1][key2][key3]' 
str2 = 'name[key1]' 
str3 = 'name' 

這裏是各自的陣列我希望能走出字符串:

arr1 = ['name', 'key1', 'key2', 'key3'] 
arr2 = ['name', 'key1'] 
arr3 = ['name'] 

因此,大家可以看到,該密鑰是可選的,可以是一個變量計數。

最近我已經能夠來是這樣的:

>> str = 'name[key1][key2][key3]' 
"name[key1][key2][key3]" 

>> str.scan(/(.+?)(\[.+?\])/) 
[["name", "[key1]"], ["[key2]", "[key3]"]] 

所以,我總是可以做一個扁平化數組,然後擺脫支架的GSUB,但我不想要一起破解它。我希望能夠一次完成它。我認爲只是在支架上做了一個字符串拆分,但是這也似乎是一種繃帶式的方法。如果任何人有關於如何能夠比正則表達式更好地實現這一點的想法,或者我如何使用我正在使用的方法正確完成這個想法,那會很棒!

回答

1

你可以使用scan而忽略了括號:

str = 'name[key1][key2][key3]' 
p str.scan(/[^\[\]]+/) 
#=> ["name", "key1", "key2", "key3"] 

str2 = 'name[key1]' 
p str2.scan(/[^\[\]]+/) 
#=> ["name", "key1"] 

str3 = 'name' 
p str3.scan(/[^\[\]]+/) 
#=> ["name"] 
+0

對不起,我試過第一個答案也是最簡單的。謝謝大家的回覆,這種情況很好!正則表達式肯定是我的一個弱點:) – Sean

0

您可以使用積極lookahead/lookbehind查找可能存在的括號,但將它們排除在匹配之外。然後,你不必使用gsubflatten都:

str = 'name[key1][key2][key3]' 
p str.scan(/(?<=\[)?\w+(?=\])?/) 
# => ["name", "key1", "key2", "key3"] 

瞭解更多關於在Ruby Docs RegExp類。

0

採用分體式?

str = 'name[key1][key2][key3]' 
print str.split(/[\[\]]+/) 
0

這會爲你工作:

str.tr('[]', ' ').split 

同時更改'['']'' ',然後分割上' '

如果您需要更改爲' '增加的字符數改變tr()到gsub()並相應地修改參數