用分割字符串。但忽略里面的内容

时间:2019-04-18 10:54:38

标签: regex ruby

我有一个字符串:

s='articles[zone.id=1].comments[user.status=active].user'

要拆分(通过split(some_regex_here))。除括号中的子字符串中的内容外,其他所有时段都需要进行拆分。

预期输出:

["articles[zone.id=1]", "comments[user.status=active]", "user"]

我将如何处理?还是除了split()之外,我还应该看看吗?

2 个答案:

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