Строка разделения в Ruby, игнорируя содержание круглых скобок?

Я должен разделить строку на список частей в Ruby, но я должен проигнорировать материал внутри paramentheses. Например:

A +4, B +6, C (hello, goodbye) +5, D +3

Я хотел бы, чтобы получающийся список был:

[0]A +4
[1]B +6
[2]C (hello, goodbye) +5
[3]D +3

Но я не могу просто разделить на запятых, потому что это разделило бы содержание круглых скобок. Существует ли способ разделить материал, не предварительно анализируя запятые в фигурных скобках во что-то еще?

Спасибо.

7
задан Colen 6 January 2010 в 20:05
поделиться

2 ответа

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

s = 'A +4, B +6, C (hello, goodbye) +5, D +3'
tokens = s.scan(/(?:\(.*?\)|[^,])+/)
tokens.each {|t| puts t.strip}

Выход:

A +4
B +6
C (hello, goodbye) +5
D +3

Краткое объяснение:

(?:        # open non-capturing group 1
  \(       #   match '('
  .*?      #   reluctatly match zero or more character other than line breaks
  \)       #   match ')'
  |        #   OR
  [^,]     #   match something other than a comma
)+         # close non-capturing group 1 and repeat it one or more times

Другой вариант - разделить на запятую с последующими пробелами только тогда, когда первая круглая скобка, которая видна, когда смотришь вперед, это открывающаяся скобка (или вообще без скобок: т.е. конец строки):

s = 'A +4, B +6, C (hello, goodbye) +5, D +3'
tokens = s.split(/,\s*(?=[^()]*(?:\(|$))/)
tokens.each {|t| puts t}

выдаст тот же результат, но я нахожу метод scan более чистым.

13
ответ дан 6 December 2019 в 10:50
поделиться
string = "A +4, B +6, C (hello, goodbye) +5, D +3"
string.split(/ *, *(?=[^\)]*?(?:\(|$))/)
# => ["A +4", "B +6", "C (hello, goodbye) +5", "D +3"]

Как работает этот регекс:

/
   *, *        # find comma, ignoring leading and trailing spaces.
  (?=          # (Pattern in here is matched against but is not returned as part of the match.)
    [^\)]*?    #   optionally, find a sequence of zero or more characters that are not ')'
    (?:        #   <non-capturing parentheses group>
      \(       #     left paren ')'
      |        #     - OR -
      $        #     (end of string)
    )
  )
/
5
ответ дан 6 December 2019 в 10:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: