如果存在模式,则包括在匹配中

时间:2017-03-22 11:56:31

标签: ruby regex

我想匹配这样的数字:

-0015.22  => -15.22
 012      =>  12
-5        => -5
 0150-12  =>  150, -12

我目前有:

-?0*(\d+\.?\d*)

哪种情况适用于所有情况,问题是当开头有“ - ”时,它不包含在捕获中(显然,因为它没有被封闭)。

我如何加入“ - ?”在捕获组中向右,同时仍然忽略0的?

2 个答案:

答案 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}然后使用反向引用(-?)插入到结果中。