![](/img/trans.png)
[英]How do I split a string by commas except inside parenthesis, using a regular expression?
[英]Split a Ruby string by colon (except inside parenthesis) using regex
我想按冒号分割字符串。
这是输入示例:
str = "one[two:[three::four][five::six]]:seven:eight[nine:ten]"
这是输出示例:
array = ["one[two:[three::four][five::six]]", "seven", "eight[nine:ten]"]
目的是了解表示在括号和嵌套括号之外的冒号的正则表达式 。
但是有一些限制:
^(.+)<colon_regex>(.*)<colon_regex>(.*)$
你能给我一个建议吗?
您可以使用一个非常简单的正则表达式:
SUB_CHAR = 0.chr
#=> "\x00"
r = /#{SUB_CHAR}/
#=> /\x00/
在s.split(r)
。
当然有一个陷阱:您必须修改传递给Puppet的字符串(以及上述正则表达式)。
str = "one[two:[three::four][five::six]]:seven:eight[nine:ten]"
count = 0
idx = str.size.times.with_object([]) do |i,a|
case str[i]
when '[' then count += 1
when ']' then count -= 1
when ':' then a << i if count.zero?
end
end
#=> [33, 39]
s = str.dup
#=> "one[two:[three::four][five::six]]:seven:eight[nine:ten]"
idx.each { |i| s[i] = SUB_CHAR }
s #=> "one[two:[three::four][five::six]]\u0000seven\u0000eight[nine:ten]"
s.split(r)
#=> ["one[two:[three::four][five::six]]", "seven", "eight[nine:ten]"]
修改此嵌套括号正则表达式,您可以执行以下操作:
txt="one[two:[three::four][five::six]]:seven:eight[nine:ten]"
pat=Regexp.new('((?>[^:\[]+|(\[(?>[^\[\]]+|\g<-1>)*\]))+)')
puts txt.scan(pat).map &:first
one[two:[three::four][five::six]]
seven
eight[nine:ten]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.