Чтобы справиться с вложенной скобкой, вы можете использовать:
txt = "a,s(d,f(4,5)),g,h"
pattern = Regexp.new('((?:[^,(]+|(\((?>[^()]+|\g<-1>)*\)))+)')
puts txt.scan(pattern).map &:first
шаблонов детали:
( # first capturing group
(?: # open a non capturing group
[^,(]+ # all characters except , and (
| # or
( # open the second capturing group
\( # (
(?> # open an atomic group
[^()]+ # all characters except parenthesis
| # OR
\g<-1> # the last capturing group (you can also write \g<2>)
)* # close the atomic group
\) #)
) # close the second capturing group
)+ # close the non-capturing group and repeat it
) # close the first capturing group
Вторая группа записи описывают вложенная скобка, которая может содержать символы, которые не являются скобками или захватом gr сам. Это рекурсивный образец.
Внутри шаблона, вы можете обратиться к улавливающей группе с его номером (\g<2>
для второго захвата группы) или с его относительным положением (\g<-1>
первого на слева от текущей позиции в шаблоне) (или с его имя, если вы используете названные группы захвата)
Примечание: вы можете разрешить одиночную скобку, если вы добавите |[()]
до конца группы, не участвующей в захвате. Затем a,b(,c
даст вам ['a', 'b(', 'c']
'txt.scan (pattern) .map &: first' решил проблему. @casimir действительно я не могу удвоить ваш голос, спасибо! – Naveed
Вы можете объяснить это регулярное выражение? его из моей головы :) – Naveed
Мне было интересно, -1 в regexp. не могли бы вы также объяснить эту часть '<-1>' – Naveed