首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby regex: scan all

Ruby regex: scan all
EN

Stack Overflow用户
提问于 2010-10-24 21:13:11
回答 4查看 1.1K关注 0票数 1

我有一个字符串:

代码语言:javascript
复制
TFS[MAD,GRO,BCN],ALC[GRO,PMI,ZAZ,MAD,BCN],BCN[ALC,...]...

我想把它转换成一个列表:

代码语言:javascript
复制
list = (
[0] => "TFS"
    [0] => "MAD"
    [1] => "GRO"
    [2] => "BCN"
[1] => "ALC"
    [0] => "GRO"
    [1] => "PMI"
    [2] => "ZAZ"
    [3] => "MAD"
    [4] => "BCN"
[2] => "BCN"
    [1] => "ALC"
    [2] => ...
[3] => ...
)

我如何在Ruby中做到这一点?

我试过了:

代码语言:javascript
复制
(([A-Z]{3})\[([A-Z]{3},+))

但它只返回[]中的第一个元素,并且不会使逗号成为可选的(在“]”的末尾)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-24 21:18:43

您需要告诉正则表达式,,不是在每个元素之后都需要的,而是在除第一个元素之外的每个参数之前。这将导致以下正则表达式:

代码语言:javascript
复制
str="TFS[MAD,GRO,BCN],ALC[GRO,PMI,ZAZ,MAD,BCN],BCN[ALC]"
str.scan(/[A-Z]{3}\[[A-Z]{3}(?:,[A-Z]{3})*\]/)
#=> ["TFS[MAD,GRO,BCN]", "ALC[GRO,PMI,ZAZ,MAD,BCN]", "BCN[ALC]"]

您还可以将scan的行为与捕获组一起使用,将每个匹配拆分为括号前的部分和括号内的部分:

代码语言:javascript
复制
str.scan(/([A-Z]{3})\[([A-Z]{3}(?:,[A-Z]{3})*)\]/)
#=> [["TFS", "MAD,GRO,BCN"], ["ALC", "GRO,PMI,ZAZ,MAD,BCN"], ["BCN", "ALC"]]

然后,您可以使用map将括号内的每个部分拆分为多个标记:

代码语言:javascript
复制
str.scan(/([A-Z]{3})\[([A-Z]{3}(?:,[A-Z]{3})*)\]/).map do |x,y|
  [x, y.split(",")]
end
#=> [["TFS", ["MAD", "GRO", "BCN"]],
#    ["ALC", ["GRO", "PMI", "ZAZ", "MAD", "BCN"]],
#    ["BCN", ["ALC"]]]
票数 2
EN

Stack Overflow用户

发布于 2010-10-24 21:25:24

这是另一种使用散列存储内容的方法,更少的正则表达式。

代码语言:javascript
复制
string = "TFS[MAD,GRO,BCN],ALC[GRO,PMI,ZAZ,MAD,BCN],BCN[ALC]"
z=Hash.new([])
string.split(/][ \t]*,/).each do |x|
   o,p=x.split("[")
   z[o]=p.split(",")
end
z.each_pair{|x,y| print "#{x}:#{y}\n"}

输出

代码语言:javascript
复制
$ ruby test.rb
TFS:["MAD", "GRO", "BCN"]
ALC:["GRO", "PMI", "ZAZ", "MAD", "BCN"]
BCN:["ALC]"]
票数 1
EN

Stack Overflow用户

发布于 2010-10-24 21:20:12

首先拆分分组

代码语言:javascript
复制
groups = s.scan(/[^,][^\[]*\[[^\[]*\]/) 
# => ["TFS[MAD,GRO,BCN]", "ALC[GRO,PMI,ZAZ,MAD,BCN]"]

现在你有了组,剩下的就很简单了:

代码语言:javascript
复制
groups.map {|x| [x[0..2], x[4..-2].split(',')] }
# => [["TFS", ["MAD", "GRO", "BCN"]], ["ALC", ["GRO", "PMI", "ZAZ", "MAD", "BCN"]]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4008345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档