繁体   English   中英

使用正则表达式按冒号(括号内除外)拆分Ruby字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM