我试图用Ruby中的正则表达式解析模式。模式类似于
<number>? <comma>? <number>? <term>*
其中:
number
是一个或多个数字comma
是","
term
的格式为[.*]
或[^.*]
我正试图捕捉数字和所有条款。为了澄清,这里有一些有效模式的例子:
5,50[foo,bar]
5,[foo][^apples]
10,100[baseball][^basketball][^golf]
,55[coke][pepsi][^drpepper][somethingElse]
首先,我想捕获5
,50
和[foo,bar]
在第二部分中,我想捕获5
,[foo]
和[^apples]
,依此类推。
我想出的模式是:
/(\d+)?,?(\d+)?(\[\^?[^\]]+\])+/
但这仅匹配数字和最后一个词。如果我在结尾删除+
,那么它只匹配第一个字词。
答案 0 :(得分:1)
我能用最少的努力思考的最简单的解决方案可能是通过围绕该组和已经存在的+
来引发额外的捕获组,即
/(\d+)?,?(\d+)?((\[\^?[^\]]+\])+)/
此外,您可以通过\d
代替(\d*)
简化(\d+)?
表达式...
修改强>
以下是用于测试上述建议的代码:
matches = [ "5,50[foo,bar]",
"5,[foo][^apples]",
"10,100[baseball][^basketball][^golf]",
",55[coke][pepsi][^drpepper][somethingElse]"
]
re = Regexp.new('(\d*),?(\d*)((\[\^?[^\]]+\])+)')
matches.each do |match|
m = re.match(match)
puts "\nMatching: #{match}"
puts "--------------------"
puts "Match 1: #{m[1]}"
puts "Match 2: #{m[2]}"
puts "Match 3: #{m[3]}"
end
和输出:
Matching: 5,50[foo,bar]
--------------------
Match 1: 5
Match 2: 50
Match 3: [foo,bar]
Matching: 5,[foo][^apples]
--------------------
Match 1: 5
Match 2:
Match 3: [foo][^apples]
Matching: 10,100[baseball][^basketball][^golf]
--------------------
Match 1: 10
Match 2: 100
Match 3: [baseball][^basketball][^golf]
Matching: ,55[coke][pepsi][^drpepper][somethingElse]
--------------------
Match 1:
Match 2: 55
Match 3: [coke][pepsi][^drpepper][somethingElse]
修改2
如果您想要使用scan
方法的J -_- L'建议进行标记化,请添加:
m[3].scan(/\[\^?[^\]]+\]/)
答案 1 :(得分:1)
问题与here相同 - 您只有固定数量的捕获组。
在您的情况下,我会拆分字符串(例如使用光电化的方法)并执行scan
(例如使用(\[\^?[^\]]+\])
)来获取组。