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

Ruby 我需要一个正则表达式来捕获字符串中的数字,ruby,regex,Ruby,Regex,我没有访问代码的权限,这是通过一个只允许我编辑解析用户响应的正则表达式的界面实现的。我需要在用户发送文本后提取权重,其中他们会发送如下文本: wt172.5 172.5磅 180 wt.173.22 172,5 我需要将权重捕获为浮点字段,但我想将其限制为最多1位小数。我尝试使用/(?[\d+(\.\124;,)\ d\d?)/,但它只保存字段中的第一个数字“1” \d+(?:[,.]\d{1,2})? 我猜你想要这个。[]是字符类,而不是你所想的。你的字符类只捕获你定义的所有字符中的一个 见

我没有访问代码的权限,这是通过一个只允许我编辑解析用户响应的正则表达式的界面实现的。我需要在用户发送文本后提取权重,其中他们会发送如下文本:

wt172.5
172.5磅
180
wt.173.22
172,5

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

\d+(?:[,.]\d{1,2})?
我猜你想要这个。
[]
是字符类,而不是你所想的。你的字符类只捕获你定义的所有字符中的一个

见演示


有时最简单的似乎不是。我建议使用以下正则表达式:

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

谢谢!我找到了一个地方会捕获任何包含的内容,但您的解决方案非常适合捕获。是否考虑将捕获的数据限制在小数点后1位?我对183.235的测试保存了所有数字我认为这不会捕获小数点/逗号右侧的数字,而且它确实捕获了右侧的多个数字…@vks,我检查了演示。您的正则表达式捕获173.22的数字。“\d+”捕获尽可能多的数字。OP说,“但我想将它限制在最多1个小数位”。@marklark这是一个简单的修复方法,可以用
\d
\d{1,2}代替
将来,您可能希望在选择答案之前等待一段时间。快速选择之后可能会有评论指出答案存在问题,可能会阻碍其他可能更好的答案,imo对那些仍在研究答案的人来说是一种不礼貌的态度。这里的许多人至少要等待几个小时。关键是不要着急@CarySwoveland谢谢!刚加入论坛,这是很有帮助的反馈我喜欢。但是,.5'怎么样?你需要将“\d+”改为“\d*”标记,我故意不匹配
”.5'
,但是如果你想,你建议的更改看起来是正确的。谢谢,Cary。我想的是“足够好了”正则表达式很难,完美的正则表达式几乎是不可能的。我只会说我的解决方案力求足够好。@马克,我不追求“完美”的正则表达式,只追求符合规范的正则表达式。正则表达式组成了一种编程语言,就像Ruby、C或其他语言一样。要在任何语言中获得想要的结果都可能是“困难的”,但一旦您获得了足够的经验并采用了适当的测试,这一切都需要一天的工作。
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"