2016-02-19 122 views
2

我无法访问代码,这是通过一个接口,只允许我编辑解析用户响应的正则表达式。我需要后用户的文本中提取的重量,他们的文字之类的东西:我需要一个正则表达式来捕获字符串中的数字

wt 172.5 172.5 lbs 180 wt. 173.22 172,5

我需要捕捉的重量为float场,但我想它限制为最多1位小数。我尝试使用/(?<val>[\d+((\.|,)\d\d?)?]/但它只能保存第一个数字“1”在现场

+1

未来,您可能希望在选择答案之前等待一段时间。快速选择之后可能会出现带有问题答案的评论,可能会阻碍其他更好的答案,对于那些仍在努力解答他们的人来说,imo是不礼貌的。许多人在这里等待至少几个小时。关键是没有急于求成。 –

+0

@CarySwoveland谢谢!新的论坛,这是有帮助的反馈 –

回答

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" 
+0

我喜欢它。但!那'.5'呢?您需要将您的'\ d +'更改为'\ d *' – marklark

+0

马克,我故意不匹配''.5',但如果您愿意,您提出的更改看起来是正确的。 –

+0

谢谢,卡里。我在想的是“足够好”的正则表达式很难,完美的正则表达式几乎是不可能的。我只会声称我的解决方案力求足够好。 – marklark

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

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

查看演示。

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

+0

谢谢!我发现有一个地方建议[]会捕获任何内容,但是您的解决方案对于捕获非常有用。关于将捕获的数据限制在1个小数位的想法?我的测试183.235保存所有数字 –

+0

我不认为这将捕获小数点/逗号右侧的数字 - 它确实捕获多个数字的权利... – marklark

+0

@marklark请检查演示 – vks

相关问题