正则表达式 - 从字符串中仅获取十进制数

Posted

技术标签:

【中文标题】正则表达式 - 从字符串中仅获取十进制数【英文标题】:Regex - Get only decimal number from string 【发布时间】:2021-09-19 07:13:46 【问题描述】:

我在下面有一个正则表达式:

(?<=Bonus)[\s+][\$][\s+]?(\d(?:[d0,2.\s]*\d)?)

这得到了预期的结果,但是,有时我也会得到一个额外的数字。

例如,这是上下文:

Bonus $0. 01 87% 88% 89% 90% 92% 93% 94%

所以我的正则表达式得到 0 。 01就好了,但不是每次。 当有更多如下行时:

Bonus $0. 01 87% 88% 89% 90% 92% 93% 94%
...
Bonus $0. 11 87% 88% 89% 90% 92% 93% 94%
...
Bonus $0. 15 87% 88% 89% 90% 92% 93% 94%
...

有时它会从字符串中得到一个额外的数字:

0. 01
0. 11 8
0. 15

或者有时会漏掉一位小数:

0. 1 (but it should be 0. 15)

预期结果将始终是一个小数点后 2 位的数字。数字中可能有也可能没有空格。可能是 0.01、0. 01 甚至 0.(更多空格)01...

我当前的正则表达式有什么问题?

【问题讨论】:

试试:(?:Bonus \$)(\d+\.(.\d+|\d+)) 【参考方案1】:

正确匹配所有内容: (?&lt;=Bonus)[\s+][\$][\s+]?(\d*\.\s*\d2?)

【讨论】:

【参考方案2】:

如果您捕获组中的数字,则不需要对 Bonus 进行后向查找,而是可以匹配它。

注意,在您的模式中,这部分是一个字符类 [d0,2.\s],它匹配任何列出的字符,包括 d 字符。

你也可以省略多余的方括号。


仅匹配带小数部分的数字(似乎总是 2 位):

\bBonus\s+\$\s*(\d+\.\s*\d2)\b

模式匹配:

\bBonus\s+\$\s* 匹配奖励、1+ 个空白字符、$ 字符和可选的空白字符 ( 捕获第 1 组 \d+\.\s*\d2 匹配 1+ 个数字、一个点、可选的空白字符和 2 个数字 )关闭第一组 \b 防止部分匹配的单词边界

Regex demo

【讨论】:

【参考方案3】:

你使用了太多的字符类,尤其是这个:[d0,2.\s] - 你不能量化一个字符类中的东西,所以这没有做它应该做的事情。 (你也可以去掉一些其他的,比如\s+而不是[\s+]

如果我理解正确,您想匹配小数点后的 2 位数字,可能会穿插空格,这可能有效:

(?<=Bonus)\s*\$\s*\d*\.(\s*\d\s*)0,2

https://regex101.com/r/nDj8Gd/1/

【讨论】:

以上是关于正则表达式 - 从字符串中仅获取十进制数的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式 C# 从字符串中获取十进制值

在 EditText 中仅允许基于正则表达式的选定字符

正则表达式多选结构的顺序

如何在bigquery中获取字符串中正则表达式的匹配数?

十进制数的正则表达式

正则表达式带逗号的十进制数