我有一个字符串:
s='articles[zone.id=1].comments[user.status=active].user'
要拆分(通过split(some_regex_here)
)。除括号中的子字符串中的内容外,其他所有时段都需要进行拆分。
预期输出:
["articles[zone.id=1]", "comments[user.status=active]", "user"]
我将如何处理?还是除了split()
之外,我还应该看看吗?
答案 0 :(得分:3)
尝试一下
s.split(/\.(?![^\[]*\])/)
我得到了这个结果,
2.3.2 :061 > s.split(/\.(?![^\[]*\])/)
=> ["articles[zone.id=1]", "comments[user.status=active]", "user"]
您也可以在这里进行测试: https://rubular.com/r/LaxEFQZJ0ygA3j
答案 1 :(得分:1)
我认为问题是要分割不在匹配括号内的时间段。
这是一个非正则表达式解决方案,可与任意数量的嵌套方括号一起使用。我以为方括号都匹配,但检查起来并不难。
def split_it(s)
left_brackets = 0
s.each_char.with_object(['']) do |c,a|
if c == '.' && left_brackets.zero?
a << '' unless a.last.empty?
else
case c
when ']' then left_brackets -= 1
when '[' then left_brackets += 1
end
a.last << c
end
end.tap { |a| a.pop if a.last.empty? }
end
split_it '.articles[zone.id=[user.loc=1]].comments[user.status=active].user'
#=> ["articles[zone.id=[user.loc=1]]", "comments[user.status=active]", "user"]