首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby regex只返回数字数组

Ruby regex只返回数字数组
EN

Stack Overflow用户
提问于 2014-07-17 16:14:47
回答 4查看 253关注 0票数 2

我有以下字符串:

代码语言:javascript
复制
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"

对于每一种情况,我希望我的正则表达式返回整数或浮点数的数组,例如第一种情况:

代码语言:javascript
复制
[
  [0] "9.5"
  [1] "10.5"
]

在对Rubular做了很多尝试之后,我想到了:

代码语言:javascript
复制
/\d+[.]\d+?/

这给了我在检查Rubular.com时所需的大多数匹配结果。然而,在2,3,6的情况下,它不会在-或x字符前面的整数上拾取,或者当int是单独的类似于大小写6时。

我遗漏了什么?

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-17 16:25:17

这应该可以做到:

代码语言:javascript
复制
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"]
票数 5
EN

Stack Overflow用户

发布于 2014-07-17 16:25:30

在正则表达式中遗漏了两样东西。

首先:通过使用?跟着它走。第二:通过添加*使值跟随点作为可选的动态长度。

代码语言:javascript
复制
\d+[.]?\d*
票数 2
EN

Stack Overflow用户

发布于 2014-07-17 16:26:24

假设您的示例输入是准确的,我将使用scan,因为这就是它的目的,并对结果稍加按摩,只返回您想要的值:

代码语言:javascript
复制
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,但对于这种输出来说,这是一个相当荒谬的值,因此我认为这种模式是相当安全的。”

如果示例输入不准确,而且实际上不存在行号,那么它就变得更简单了:

代码语言:javascript
复制
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"]]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24808638

复制
相关文章

相似问题

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