6

我想用逗号分割一个字符串:

"a,s".split ','  # => ['a', 's']

如果子字符串被括号包裹,我不想拆分它:

"a,s(d,f),g,h"

应该产生:

['a', 's(d,f)', 'g', 'h']

有什么建议吗?

4

2 回答 2

12

要处理嵌套括号,您可以使用:

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

第二个捕获组描述可以包含不是括号的字符或捕获组本身的嵌套括号。这是一种递归模式。

在模式中,您可以使用他的编号(\g<2>用于第二个捕获组)或他的相对位置(\g<-1>模式中当前位置左侧的第一个) (或者如果您使用命名捕获,则使用他的名字)来引用一个捕获组组)

|[()]注意:如果在非捕获组的末尾添加,则可以允许单括号。然后a,b(,c会给你['a', 'b(', 'c']

于 2013-08-25T00:45:35.410 回答
3

假设括号没有嵌套:

"a,s(d,f),g,h"
.scan(/(?:\([^()]*\)|[^,])+/)
# => ["a", "s(d,f)", "g", "h"]
于 2013-08-25T00:09:35.770 回答