Разделить строку на. но игнорируй что внутри [] - PullRequest
2 голосов
/ 18 апреля 2019

У меня есть строка:

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 ]

3 голосов
/ 18 апреля 2019

Попробуйте это,

s.split(/\.(?![^\[]*\])/)

Я получил этот результат,

2.3.2 :061 > s.split(/\.(?![^\[]*\])/)
=> ["articles[zone.id=1]", "comments[user.status=active]", "user"] 

Вы также можете проверить это здесь: https://rubular.com/r/LaxEFQZJ0ygA3j

1 голос
/ 18 апреля 2019

Я предполагаю, что проблема состоит в разделении на периоды, которые не находятся в соответствующих скобках.

Вот решение без регулярных выражений, которое работает с любым количеством вложенных скобок.Я предположил, что все скобки совпадают, но проверить это несложно.

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"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...