具有可变选项的ruby正则表达式

时间:2014-03-12 17:24:38

标签: ruby regex arrays

我无法找出解析特定字符串集的最佳方法。

我将会遇到的一些字符串示例是:

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

所以,我总是可以在该数组上做一个flatten,然后用gsub来摆脱括号,但我不想只是将它们一起破解。我希望能够一次完成它。我认为只是在括号中进行了一个字符串拆分,但这似乎也是一种绑定方法。如果有人有关于我如何比正则表达式更好地完成这一点的想法,或者我如何使用我正在使用的方法正确地完成这一点,那就太棒了!

4 个答案:

答案 0 :(得分: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"]

答案 1 :(得分:0)

您可以使用正向前瞻/后瞻来查找可能存在的括号,但将其从匹配中排除。然后,您根本不必使用gsubflatten

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

Ruby Docs中了解有关Regexp类的更多信息。

答案 2 :(得分:0)

使用split ??

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

答案 3 :(得分:0)

这对你有用:

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

'['']'同时更改为' ',然后拆分' '

如果需要更改为' '的字符数增加,则将tr()更改为gsub()并相应地修改参数