['a', 's'] 如果子字符串被括号包裹,我不想拆分它: "a,s(d,f),g,h" 应该产生: ['a', 's(d,f-6ren">
gpt4 book ai didi

ruby - 如何使用正则表达式用逗号分隔字符串(括号内除外)?

转载 作者:数据小太阳 更新时间:2023-10-29 07:02:54 28 4
gpt4 key购买 nike

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

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

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

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

应该产生:

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

有什么建议吗?

最佳答案

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

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> 模式中当前位置左侧的第一个)来引用捕获组 < i>(如果您使用命名捕获组,则使用他的名字)

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

关于ruby - 如何使用正则表达式用逗号分隔字符串(括号内除外)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18424315/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com