十进制数正则表达式,其中十进制后的数字是可选的


Answers:


189

使用以下内容:

/^\d*\.?\d*$/
  • ^ -生产线的起点;
  • \d* -0或更多数字;
  • \.?-一个可选的点(由于在正则表达式中转义,.是一个特殊字符);
  • \d* -0或更多数字(小数部分);
  • $ - 队伍的尽头。

这允许0.5小数而不是要求前导零,例如0.5


2
@OrangeDog,您的原始匹配项可能超出预期。例如'cow3.45tornado';)
S. Albano

39
它还匹配一个不是有效十进制数字的点。更好的正则表达式将/^\d*\.?\d+$/强制小数点后的数字。
Chandranshu

2
@Chandranshu,它匹配一个空字符串,您的更改也可以解决。
OGHaza

2
@Chandranshu“小数点后不需要数字”
OrangeDog 2014年

3
该解决方案不起作用。它需要小数点,而OP会明确指出:可选小数点。
Alex G

113
/\d+\.?\d*/

一个或多个数字(\d+),可选的句点(\.?),零个或多个数字(\d*)。

根据您的用法或正则表达式引擎,您可能需要添加起始/结束行锚点:

/^\d+\.?\d*$/

正则表达式可视化

Debuggex演示


12
是的,但票数最高的答案是错误的,它与.空字符串都匹配。
OrangeDog 2014年

1
@Gangnus也没有说“ .digit”应该匹配。如果他们想要那样,那么他们应该说。
OrangeDog

2
@EqualityInTech我很确定不是-它完全没有分组。
OrangeDog

1
嗯...我想我可能不像我想的那样完全理解邪恶的正则表达式。抱歉。
JDB仍然记得莫妮卡

1
@AlexanderRyanBaggett这与指定的问题完全匹配。如您所见,它根本不包含在内-
OrangeDog

74

您需要如下所示的正则表达式才能正确执行此操作:

/^[+-]?((\d+(\.\d*)?)|(\.\d+))$/

使用扩展修饰符(由Perl支持),具有与空格相同的表达式:

/^  [+-]? ( (\d+ (\.\d*)?)  |  (\.\d+) ) $/x

或带有注释:

/^           # Beginning of string
 [+-]?       # Optional plus or minus character
 (           # Followed by either:
   (           #   Start of first option
     \d+       #   One or more digits
     (\.\d*)?  #   Optionally followed by: one decimal point and zero or more digits
   )           #   End of first option
   |           # or
   (\.\d+)     #   One decimal point followed by one or more digits
 )           # End of grouping of the OR options
 $           # End of string (i.e. no extra characters remaining)
 /x          # Extended modifier (allows whitespace & comments in regular expression)

例如,它将匹配:

  • 123
  • 23.45
  • 34。
  • .45
  • -123
  • -273.15
  • -42。
  • -.45
  • +516
  • +9.8
  • +2。
  • +.5

并将拒绝这些非数字:

  • 。(单小数点)
  • - (负小数点)
  • +。(加上小数点)
  • (空字符串)

比较简单的解决方案可能会错误地拒绝有效数字或匹配这些非数字。


1
最佳,因为它与数字后跟一个句点(42.)相匹配。但是,存在一个错误/误报,因为它与此匹配:3 .... 3,可以通过添加两个以上的圆括号来强制^ $开头和结尾字符来解决此错误/错误:/ ^([+-]?(\ d +(\ 。\ d *)?)|(\。\ d +))$ /
Pete Alvin 2014年

1
谢谢皮特,发现得很好。现在,通过添加额外的括号使答案得到了纠正,因此可以按预期运行。现在写成^A?(B|C)$。以前,它的写法是“ ^A?B|C$实际上意味着(^A?B)|(C$)哪个不正确”。注意:^(A?B|C)$这也是不正确的,因为它实际上意味着^((A?B)|(C))$不匹配“ +.5”。
霍伊伦2014年

2
这是最好的答案。其他答案不能解决所有情况。我自己做了类似的事情,除了我使用前瞻来处理缺少数字的情况:/^[+-]?(?=\d|\..d)\d*(\.\d*)?$ /
PhilHarvey

1
那是这里唯一正确的正则表达式。但是有些人不同意“ 34”。我建议在第二个d之后而不是*
Gangnus '17

1
这也匹配0000.2,这可能不是所需的。
亚伦·佐雷尔

11

试试这个正则表达式:

\d+\.?\d*

\ d +可选小数点前的数字
。可选十进制(由于?量而可选)
\ d *十进制后的可选数字


1
不,那一个不匹配123.
Bart Kiers 2012年

1
感谢您的来信。修改了我的正则表达式。
卡什

4
确实,但是现在您只是将其编辑为其他人已经发布的内容。考虑只删除另一个“正确”的答案。
巴特·基尔斯

10

我认为这是最好的,因为它符合所有要求:

^\d+(\\.\d+)?$

1
对我来说,这是最好的答案,因为字符串:“ 4”。(例如)至少在红宝石语言中不是有效数字。但是,最受支持的答案是“ 4”。作为数字正则表达式,这是错误的。
维克多




2

这就是我所做的。它比以上任何一项都严格(比某些更正确):

^0$|^[1-9]\d*$|^\.\d+$|^0\.\d*$|^[1-9]\d*\.\d*$

传递的字符串:

0
0.
1
123
123.
123.4
.0
.0123
.123
0.123
1.234
12.34

失败的字符串:

.
00000
01
.0.
..
00.123
02.134

2
^[+-]?(([1-9][0-9]*)?[0-9](\.[0-9]*)?|\.[0-9]+)$

应该反映人们通常认为的格式正确的十进制数。

小数点前的数字可以是一个数字(在这种情况下,可以是0到9),也可以是一个以上的数字(在这种情况下,它不能以0开头)。

如果在小数点符号之前存在任何数字,则小数点及其后的数字是可选的。否则,必须使用小数点后跟至少一位数字。请注意,小数点后允许多个尾随0。

grep -E '^[+-]?(([1-9][0-9]*)?[0-9](\.[0-9]*)?|\.[0-9]+)$'

正确匹配以下内容:

9
0
10
10.
0.
0.0
0.100
0.10
0.01
10.0
10.10
.0
.1
.00
.100
.001

以及它们的签名等效项,而它拒绝以下内容:

.
00
01
00.0
01.3

及其已签名的等价物以及空字符串。


1
(?<![^d])\d+(?:\.\d+)?(?![^d])

干净简单。

这使用后缀和前缀,RegEx功能。

它直接返回true-IsMatch条件为false


1
^\d+(()|(\.\d+)?)$

想到了这一点。允许同时使用整数和十进制,但是如果决定输入十进制,则强制使用完整的十进制(前导数字和尾随数字)。


1

您的要求已经得到回答,因此这对于那些只输入2个小数位(如果输入了可选的小数点)的人来说只是一个附加信息:

^\d+(\.\d{2})?$

^:字符串的开头
\ d:一个数字(等于[0-9])
+:一个且无限制的次数

捕获组(。\ d {2})?
?:零一倍。:字符。
\ d:一个数字(等于[0-9])
{2}:正好2倍
$:字符串的结尾

1:匹配
123:匹配
123.00:匹配
123 .:不匹配
123 ..:不匹配
123.0:不匹配
123.000:不匹配
123.00.00:不匹配


这是否匹配负数?
亚历山大·赖安·巴格特

1
@AlexanderRyanBaggett,您需要检查是否为负号,这样就可以了:^-?\ d +(\。\ d {2})?$
PersyJack

0

在Perl中,使用Regexp :: Common,它将使您可以为特定的数字格式组装经过微调的正则表达式。如果您不使用Perl,则生成的正则表达式通常仍可被其他语言使用。

在Regexp :: Common :: Number中打印生成示例正则表达式的结果:

$ perl -MRegexp::Common=number -E 'say $RE{num}{int}'
(?:(?:[-+]?)(?:[0123456789]+))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[-+]?)(?:[0123456789]+))|))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}{-base=>16}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789ABCDEF])(?:[0123456789ABCDEF]*)(?:(?:[.])(?:[0123456789ABCDEF]{0,}))?)(?:(?:[G])(?:(?:[-+]?)(?:[0123456789ABCDEF]+))|))

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.