我有以下字符串:
1: "AMETHYST 9.5x10.5 OVAL CHECKERBOARD AAA"
2: "AMETHYST 9x10 OVAL CHECKERBOARD AAA"
3: "AMETHYST 9-10 OVAL CHECKERBOARD AAA"
4: "AMETHYST 9.5-10.5 OVAL CHECKERBOARD AAA"
5: "AMETHYST 9.5 OVAL CHECKERBOARD AAA"
6: "AMETHYST 9 OVAL CHECKERBOARD AAA"对于每一种情况,我希望我的正则表达式返回整数或浮点数的数组,例如第一种情况:
[
[0] "9.5"
[1] "10.5"
]在对Rubular做了很多尝试之后,我想到了:
/\d+[.]\d+?/这给了我在检查Rubular.com时所需的大多数匹配结果。然而,在2,3,6的情况下,它不会在-或x字符前面的整数上拾取,或者当int是单独的类似于大小写6时。
我遗漏了什么?
谢谢!
发布于 2014-07-17 16:25:17
这应该可以做到:
def doit(str)
str.scan(/\d+\.?\d*/)
end
doit "AMETHYST 9.5x10.5 OVAL CHECKERBOARD AAA" #=> ["9.5", "10.5"]
doit "AMETHYST 9x10 OVAL CHECKERBOARD AAA" #=> ["9", "10"]
doit "AMETHYST 9-10 OVAL CHECKERBOARD AAA" #=> ["9", "10"]
doit "AMETHYST 9.5-10.5 OVAL CHECKERBOARD AAA" #=> ["9.5", "10.5"]
doit "AMETHYST 9.5 OVAL CHECKERBOARD AAA" #=> ["9.5"]
doit "AMETHYST 9 OVAL CHECKERBOARD AAA" #=> ["9"]发布于 2014-07-17 16:25:30
在正则表达式中遗漏了两样东西。
首先:通过使用?跟着它走。第二:通过添加*使值跟随点作为可选的动态长度。
\d+[.]?\d*发布于 2014-07-17 16:26:24
假设您的示例输入是准确的,我将使用scan,因为这就是它的目的,并对结果稍加按摩,只返回您想要的值:
strings = [
'1: "AMETHYST 9.5x10.5 OVAL CHECKERBOARD AAA"',
'2: "AMETHYST 9x10 OVAL CHECKERBOARD AAA"',
'3: "AMETHYST 9-10 OVAL CHECKERBOARD AAA"',
'4: "AMETHYST 9.5-10.5 OVAL CHECKERBOARD AAA"',
'5: "AMETHYST 9.5 OVAL CHECKERBOARD AAA"',
'6: "AMETHYST 9 OVAL CHECKERBOARD AAA"',
]
strings.map{ |s| s.scan(/\d+[.\d]*/)[1..-1] }
# => [["9.5", "10.5"],
# ["9", "10"],
# ["9", "10"],
# ["9.5", "10.5"],
# ["9.5"],
# ["9"]]/\d+[.\d]*/的意思是“查找一个或多个数字,可选地后面跟着任意数量的'.'和数字。这将与前面的1:相匹配,但切片数组会剥离这些数字。如果存在像1.0.0.0这样的数字,模式将返回1.0.0.0,但对于这种输出来说,这是一个相当荒谬的值,因此我认为这种模式是相当安全的。”
如果示例输入不准确,而且实际上不存在行号,那么它就变得更简单了:
strings = [
'"AMETHYST 9.5x10.5 OVAL CHECKERBOARD AAA"',
'"AMETHYST 9x10 OVAL CHECKERBOARD AAA"',
'"AMETHYST 9-10 OVAL CHECKERBOARD AAA"',
'"AMETHYST 9.5-10.5 OVAL CHECKERBOARD AAA"',
'"AMETHYST 9.5 OVAL CHECKERBOARD AAA"',
'"AMETHYST 9 OVAL CHECKERBOARD AAA"',
]
strings.map{ |s| s.scan(/\d+[.\d]*/) }
# => [["9.5", "10.5"],
# ["9", "10"],
# ["9", "10"],
# ["9.5", "10.5"],
# ["9.5"],
# ["9"]]https://stackoverflow.com/questions/24808638
复制相似问题