使用正则表达式匹配包含空格以及不包含空格的数字和小数点

3
我正在寻找一个正则表达式字符串来匹配一组数字:
  1. 9.50(没有空格的数字,有2到4个小数点)
  2. 1 9 . 5 0(带有空格的数字,有2到4个小数点)
  3. 10(没有空格和小数点的数字)
到目前为止,我已经想出了正则表达式字符串[0-9\s\.]+,但这不是我想要的。有更简洁的解决方案吗?
非常感谢

制表符或换行符也算空格吗? - Willem Van Onsem
此外,最大是2-4位小数吗? - Willem Van Onsem
最后,您能提供您使用的编程语言吗?正则表达式有许多方言。 - Willem Van Onsem
这个“集合”中的数字是单独的字符串,还是您需要正则表达式来匹配一个字符串中的多个“数字”?例如:“9.50 1 9 . 5 0 10”。 - Michael Curtis
4个回答

3

试试这个:

[\d\s]+(?:\.(?:\s*\d){2,4})?

这使得小数点及其后的数字/空格变为可选项。如果有数字,则使用{2,4}检查其中是否有2-4个数字。 演示 如果只匹配整个字符串,您可以将其锚定。
^[\d\s]+(?:\.(?:\s*\d){2,4})?\s*$

没问题,我的评论一点儿也不是有冒犯的意思。顺便加一分。 - Willem Van Onsem
抱歉这有点挑剔,但是这个正则表达式匹配了“1 1 . 2 3 6 7 4 5”,其中小数点后的数字超过了2-4位。 (我正在使用PHP preg_match)有可能只计算数字吗? - Michael Curtis
它匹配了 1 1 . 2 3 6 7,额外的数字不是匹配的一部分。 - Barmar
preg_match 只是告诉你字符串中是否有匹配项。由于正则表达式没有锚定,因此在它之前或之后的额外内容不会停止匹配。 - Barmar
@Barmar,我确实看到它只捕获了4位数字,而没有完整的字符串。有可能只计算数字并忽略空格吗? - Michael Curtis
显示剩余3条评论

2
您的正则表达式存在问题,它也会匹配 127.0.0.1 这样的IP4地址,而不是一个数字。
以下正则表达式应该可以解决问题:
[0-9]+[0-9\s]*(\.(\s*[0-9]){2,4})?

我做出的假设是:您需要至少在逗号之前放置一个数字。 regex101演示

感谢您的回复。它与第一组数字中的整数部分不匹配,只匹配小数部分。它也不匹配第三组数字。我希望所有组都匹配。 - JohnNg
@B.Ng:你可以提供更多的测试例子吗?所有给出的示例似乎都匹配。或者更明确地指定应该/不应该匹配的内容。 - Willem Van Onsem
我知道问题出在哪里了。我使用的是regexr.com。由于某种原因,它没有匹配到其中一个集合中的句号。然而,当我在regex101.com上测试时,它却起作用了。 - JohnNg

0

(\d+[\d\s]*\.((\s*\d){2,4})?|\d+)

在第三个例子中,我仍然选择了“尾随空格”。

这样可以消除它们。


太棒了,Kennah!它运行得非常好。我没有注意到末尾的空格。你做得很好。非常感谢。 - JohnNg

0

这个也可以工作吗 - '[^. 0-9]'

我的完整postgresql查询如下:

split_part(regexp_replace(columnyoudoregexon , '[^. 0-9]', '', 'g'), ' ', 1)

它正在执行以下操作:

  1. 列中的值除了数字、空格和点(用于小数)外,其余字符都被替换为空字符串。
  2. 使用split_part()拆分这个新的字符字符串,然后调用您想要的结果列表中的哪个元素。

我曾经陷入此问题困境很长时间。希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接