我需要一个正则表达式来捕获字符串中的数字

时间:2016-02-19 17:53:25

标签: ruby regex

我无法访问代码,这是通过一个界面,只允许我编辑解析用户响应的正则表达式。我需要在用户文本之后提取权重,在那里他们发送文字:

wt 172.5 172.5 lbs 180 wt. 173.22 172,5

我需要将权重捕获为浮点字段,但我想将其限制为最多1个小数位。我尝试使用/(?<val>[\d+((\.|,)\d\d?)?]/,但它只保存字段中的第一个数字“1”

2 个答案:

答案 0 :(得分:2)

有时似乎最简单的事情并非如此。我建议使用这个正则表达式:

r = /(?<=\A|\s)\d+(?:[.,]\d)?(?=\d|\s|\z)/

我们可以使用扩展自由间距模式定义正则表达式(通过在最终x之后添加修饰符/),这允许我们包括文档:

r = /
    (?<=\A|\s)  # match beginning of string or space in a positive lookbehind
    \d+         # match one or more digits
    (?:[.,]\d)? # optionally (? after non-capture group) match a . or , then a digit
    (?=\d|\s|\z) # match a digit, space or the end of the string in a positive lookahead
    /x

"wt 172.5"[r]      #=> "172.5" 
"172.5 lbs"[r]     #=> "172.5" 
"180"[r]           #=> "180" 
"wt. 173.22"[r]    #=> "173.2" 
"172,5"[r]         #=> "172,5" 
"A1 143.66"[r]     #=> "143.6" 
"A1 1.3.4 43.6"[r] #=> "43.6" 

答案 1 :(得分:0)

\d+(?:[,.]\d{1,2})?

猜猜你想要这个。[]是字符类,而不是你的想法。你的字符类只捕获你定义的所有字符中的一个。

参见演示。

https://regex101.com/r/eB8xU8/12