【发布时间】:2012-08-20 11:13:50
【问题描述】:
我需要一个验证数字的正则表达式,但不需要小数点后的数字。 即。
123
123.
123.4
都是有效的
123..
无效
任何将不胜感激!
【问题讨论】:
标签: regex
我需要一个验证数字的正则表达式,但不需要小数点后的数字。 即。
123
123.
123.4
都是有效的
123..
无效
任何将不胜感激!
【问题讨论】:
标签: regex
使用以下内容:
/^\d*\.?\d*$/
^ - 行首;\d* - 0 位或更多位;\.? - 可选点(已转义,因为在正则表达式中,. 是一个特殊字符);\d* - 0 位或更多位(小数部分);$ - 行尾。这允许 0.5 小数,而不需要前导零,例如 0.5
【讨论】:
/^\d*\.?\d+$/,它将强制在小数点后输入一个数字。
/\d+\.?\d*/
一位或多位数字 (\d+)、可选句点 (\.?)、零位或多位数字 (\d*)。
根据您的使用情况或正则表达式引擎,您可能需要添加开始/结束行锚点:
/^\d+\.?\d*$/
【讨论】:
. 和空字符串。
-。
你需要一个像下面这样的正则表达式才能正确地做到这一点:
/^[+-]?((\d+(\.\d*)?)|(\.\d+))$/
带有空格的相同表达式,使用扩展修饰符(Perl 支持):
/^ [+-]? ( (\d+ (\.\d*)?) | (\.\d+) ) $/x
或使用 cmets:
/^ # 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)
例如会匹配:
并且会拒绝这些非数字:
更简单的解决方案可能会错误地拒绝有效数字或匹配这些非数字。
【讨论】:
^A?(B|C)$。以前,它被写成^A?B|C$ 这实际上意味着(^A?B)|(C$) 这是不正确的。注意:^(A?B|C)$ 也不正确,因为它实际上表示^((A?B)|(C))$ 不会匹配“+.5”。
这符合所有要求:
^\d+(\.\d+)?$
【讨论】:
试试这个正则表达式:
\d+\.?\d*
\d+ 可选小数点前的数字
.?可选小数(可选由于 ? 量词)
\d* 小数点后的可选数字
【讨论】:
123.
我最终使用了以下内容:
^\d*\.?\d+$
这使得以下内容无效:
.
3.
【讨论】:
你可以用这个:
^\d+(\.\d)?\d*$
匹配:
11
11.1
0.2
不匹配:
.2
2.
2.6.9
【讨论】:
这就是我所做的。它比上述任何一个都更严格(并且比某些更正确):
^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
【讨论】:
^[+-]?(([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
及其签名的等价物,以及空字符串。
【讨论】:
什么语言? Perl 风格:^\d+(\.\d*)?$
【讨论】:
您所问的问题已经得到解答,因此如果输入可选的小数点,这只是对于那些只想要 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 : 不匹配
【讨论】:
(?<![^d])\d+(?:\.\d+)?(?![^d])
干净简单。
这使用后缀和前缀、RegEx 功能。
IsMatch 条件直接返回真 - 假
【讨论】:
^\d+(()|(\.\d+)?)$
想出了这个。允许整数和小数,但如果您决定输入小数,则强制使用完整的小数(前导和尾随数字)。
【讨论】:
试试这个。 ^[0-9]\d{0,9}(\.\d{1,3})?%?$ 它已经过测试并为我工作。
【讨论】:
^\d+((.)|(.\d{0,1})?)$
如果您想允许多个数字,请使用\d+ 而不是\d{0,1},如果您想在昏迷后最多允许两个数字,请使用\d{0,2} 而不是\d{0,1}。请参阅下面的示例以供参考:
或
^\d+((.)|(.\d{0,2})?)$
或
^\d+((.)|(.\d+)?)$
在这里玩正则表达式:https://regex101.com/
【讨论】:
在 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]+))|))
【讨论】: