我想匹配这样的数字:
-0015.22 => -15.22
012 => 12
-5 => -5
0150-12 => 150, -12
我目前有:
-?0*(\d+\.?\d*)
哪种情况适用于所有情况,问题是当开头有“ - ”时,它不包含在捕获中(显然,因为它没有被封闭)。
我如何加入“ - ?”在捕获组中向右,同时仍然忽略0的?
答案 0 :(得分:1)
必须有一些后期处理,但更简单的方法(好吧,至少对我而言)将使用(-?)0*(\d\.?\d*)
的正则表达式如下:
regex = /(-?)0*(\d\.?\d*)/
results = []
[
"-0015.22",
"012",
"-5",
"0150-12"
].each { |s|
result = s.scan( regex )
result.each { |r|
results << r.join("")
}
}
puts "results: #{results}"
可以看到实时样本here
答案 1 :(得分:0)
由于无法匹配并将非相邻文本放入单个捕获中,您可以使用解决方法:匹配数字,然后删除前导零作为后处理步骤:
s = '-0015.22 012 -5 0150-12'
res = s.scan(/-?0*\d+(?:\.\d*)?/).map { |item|
item.sub(/\A(-?)0+/, '\1')
}
# res = ["-0015.22", "012", "-5", "0150", "-12"]
请参阅online Ruby demo。
此处,.sub(/\A(-?)0+/, '\1')
将删除字符串开头的所有1 + 0(\A
),同时保留被捕获1或0次的可选-
({{1}然后使用反向引用(-?)
插入到结果中。