Regex 不带美元符号的货币正则表达式?

Regex 不带美元符号的货币正则表达式?,regex,Regex,我需要一个正则表达式来检查一个数值,以确保它在“.”后面有两个小数位,例如0.01、0.10可以,但2.0或0.1不可以。使用0.00或0或0.0也不正常 它与货币一起使用。但是,我不需要担心$符号或逗号 [0-9]+\[0-9][0-9] 那是 小数点前至少有一个十进制数字 文字小数点 小数点后的两位数字 你没有提到你使用的是哪种正则表达式符号,但这在任何一种正则表达式中都很接近。[0-9]+\[0-9][0-9] [0-9]+\.[0-9][0-9](?:[^0-9]|$) 那是 小

我需要一个正则表达式来检查一个数值,以确保它在“.”后面有两个小数位,例如0.01、0.10可以,但2.0或0.1不可以。使用0.00或0或0.0也不正常

它与货币一起使用。但是,我不需要担心$符号或逗号

[0-9]+\[0-9][0-9]

那是

  • 小数点前至少有一个十进制数字
  • 文字小数点
  • 小数点后的两位数字
你没有提到你使用的是哪种正则表达式符号,但这在任何一种正则表达式中都很接近。

[0-9]+\[0-9][0-9]

[0-9]+\.[0-9][0-9](?:[^0-9]|$)
那是

  • 小数点前至少有一个十进制数字
  • 文字小数点
  • 小数点后的两位数字
你没有提到你使用的是哪种正则表达式符号,但这在任何一种符号中都很接近

[0-9]+\.[0-9][0-9](?:[^0-9]|$)
我不认为相同的正则表达式是检查0.00的正确位置(如果您真的需要的话)——使用其他代码,而不是非常复杂的正则表达式


我不认为同一个正则表达式是检查0.00的正确位置(如果您真的需要的话)——使用其他代码,而不是非常复杂的正则表达式。

您还没有指定您要查找的正则表达式类型,或者使用的语言。因为不是所有的东西都有Perl风格的正则表达式和符号,比如
?:
,下面是您想要的

/^(0\.([1-9][0-9]|[0-9][1-9])|[1-9][0-9]*\.[0-9][0-9])$/
这里的逻辑是,小数点的左侧或右侧必须有一个非零,对该非零的求值需要两个单独的regexp,并由一个
连接。在左侧,所有以0开头的值必须在小数点右侧某处有1。在右边,我们可以允许零美元数字,但只有在左边以非零开始时

      ([1-9][0-9]|[0-9][1-9])
正如Devin所建议的,这是一个更复杂的regexp,因为需要避免零值。我支持他的建议,即您应该与regexp分开进行数值计算

更新(根据评论):

以下是RE的更详细细分:

我们有两个基本的子表达式:

/^(0\.                       |[1-9][0-9]*\.          )$/
第一个子表达式匹配以零开头的所有内容。第二个匹配以非零开头的所有内容

      ([1-9][0-9]|[0-9][1-9])
对于以零开头的内容,请确保以下两个字符至少包含一个非零字符

                             |
或者。。。(这是最外层括号中的表达式)

匹配以非零开头的内容

                                           [0-9][0-9])$/
因为我们已经得到了一个正值,这些值可以包含0


是否清除?

您尚未指定要查找的regexp类型,或将在其中使用的语言。因为不是所有的东西都有Perl风格的正则表达式和符号,比如
?:
,下面是您想要的

/^(0\.([1-9][0-9]|[0-9][1-9])|[1-9][0-9]*\.[0-9][0-9])$/
这里的逻辑是,小数点的左侧或右侧必须有一个非零,对该非零的求值需要两个单独的regexp,并由一个
连接。在左侧,所有以0开头的值必须在小数点右侧某处有1。在右边,我们可以允许零美元数字,但只有在左边以非零开始时

      ([1-9][0-9]|[0-9][1-9])
正如Devin所建议的,这是一个更复杂的regexp,因为需要避免零值。我支持他的建议,即您应该与regexp分开进行数值计算

更新(根据评论):

以下是RE的更详细细分:

我们有两个基本的子表达式:

/^(0\.                       |[1-9][0-9]*\.          )$/
第一个子表达式匹配以零开头的所有内容。第二个匹配以非零开头的所有内容

      ([1-9][0-9]|[0-9][1-9])
对于以零开头的内容,请确保以下两个字符至少包含一个非零字符

                             |
或者。。。(这是最外层括号中的表达式)

匹配以非零开头的内容

                                           [0-9][0-9])$/
因为我们已经得到了一个正值,这些值可以包含0

清除?

您可以使用:

下面是一个perl实现:

#!/usr/bin/perl 
use strict;
use warnings;
use 5.010;

my $re = qr/^(?!0\.00)\d+\.\d{2}$/;
while(<DATA>) {
    chomp;
    say (/$re/ ? "OK : $_" : "KO : $_");
}

__DATA__
1
2.2
1.23
0.01
0.00
12.345
您可以使用:

下面是一个perl实现:

#!/usr/bin/perl 
use strict;
use warnings;
use 5.010;

my $re = qr/^(?!0\.00)\d+\.\d{2}$/;
while(<DATA>) {
    chomp;
    say (/$re/ ? "OK : $_" : "KO : $_");
}

__DATA__
1
2.2
1.23
0.01
0.00
12.345

这不是“点后至少有两位数字”吗?不是“正好两位小数”?不,正好是两位小数。没有Kleene重复运算符(+或*)不,我的意思是这不匹配2.345678,可以假定它不是一个美元金额吗?正如我所说,不匹配。它将只匹配超过小数点两位字符的字符串。任意数字,后跟任意数字,句点。我最后再试一次;我想我们的谈话目的是相互矛盾的。给定“2.345678”,您的regexp匹配并返回“2.34”,我同意它正好超过小数点两位数,但“2.345678”没有正好超过小数点两位数,因此可能不是美元金额。对于“货币的正则表达式”,我认为“2.34”部分不应该匹配,所以我会用一个“要么什么都没有,要么后面没有数字”后缀来写。这不是“点后至少有两位数字”,不是“精确的两位小数”?不,这是精确的两位小数。没有Kleene重复运算符(+或*)不,我的意思是这不匹配2.345678,可以假定它不是一个美元金额吗?正如我所说,不匹配。它将只匹配超过小数点两位字符的字符串。任意数字,后跟任意数字,句点。我最后再试一次;我想我们的谈话目的是相互矛盾的。给定“2.345678”,您的regexp匹配并返回“2.34”,我同意它正好超过小数点两位数,但“2.345678”没有正好超过小数点两位数,因此可能不是美元金额。对于“货币的正则表达式”,我认为“2.34”部分不应该是ma