如何编写匹配从 -214748.00
或 -214748
到 214748.00
的货币数字范围的正则表达式?
我试过这个,但没有工作。
^[-]?[0-9]{1,214748 }(?:\.[0-9]{2})?$
Nonono。您使用了错误的工具来完成作业。正则表达式只是一个文本处理工具。它不善于解释文本的含义。在识别需要处理的文本的语义时,这就是正则表达式不好的地方。
您应该为这项工作使用简单的语言工具和运算符。除此之外,如果您处理货币,请避免使用 double
或 float
.它们没有足够的精度来准确表示所有浮点数。请改用BigDecimal
。
警告:请不要将其用于此类问题:
注意:这不处理浮点数。
既然你这么坚持,我想出了以下正则表达式,它适用于我测试过的一些输入。我想它适用于给定范围内的任何整数值:
"-?(\d{1,5}|1\d{5}|2(?:0\d{4}|1(?:[0-3]\d{3}|4(?:[0-6]\d{2}|7(?:[0-3]\d|4[0-8])))))"
-?
表示负数的可选-
。
演示代码:
String str = "-?(\d{1,5}|1\d{5}|2(?:0\d{4}|1(?:[0-3]\d{3}|4(?:[0-6]\d{2}|7(?:[0-3]\d|4[0-8])))))";
System.out.println("214748".matches(str)); // true
System.out.println("214746".matches(str)); // true
System.out.println("2148".matches(str)); // true
System.out.println("-21448".matches(str)); // true
System.out.println("-214747".matches(str)); // true
System.out.println("214749".matches(str)); // false
正则表达式使用以下事实。对于范围[-214748, 214748]
:
- 任何 5 位或更少的数字都是有效的 -
\d{1,5}
- 任何以
1
开头的 6 位数字均有效 -1\d{5}
- 对于以
2
开头的数字:- 另外以
0
开头的 5 位数字有效 -20\d{4}
- 如果
2
旁边的数字1
- 以
[0-3]
开头的任何其他 4 位数字均有效 -21[0-3]\d{3}
- 对于以
4
开头的任何其他 4 位数字:- 以
[0-6]
开头的数字有效 -214[0-6]d{2}
- 如果
4
后面的数字是7
,则- 任何其他以
[0-3]
开头的数字都是有效的 -2147[0-3]\d
- 如果
7
后面的数字是4
,则4
之后的范围[0-8]
有效 -21474[0-8]
- 任何其他以
- 以
- 以
- 另外以
这是一个有效的正则表达式,可以满足您的要求:
^-?((([0-9]{1,5}|1[0-9]{5}|2(0[0-9]{4}|1([0-3][0-9]{3}|4([0-6][0-9]{2}|7([0-3][0-9]|4[0-7])))))([.][0-9]{2})?)|214748([.]00)?)$
这在很大程度上依赖于以下子正则表达式,它与从 0 到 214747 的范围相匹配:
([0-9]{1,5}|1[0-9]{5}|2(0[0-9]{4}|1([0-3][0-9]{3}|4([0-6][0-9]{2}|7([0-3][0-9]|4[0-7])))))
为什么从 0 到 214747而不是从 0 到 214748?因为这样做更容易避免匹配从 214748.01 到 214748.99 (+/-( 的值。分解正则表达式,我们得到:
^ # match start of line
-? # optional minus sign
( # match one of the following groups, this one:
(
([0-9]{1,5}|1[0-9]{5}|2(0[0-9]{4}|1([0-3][0-9]{3}|4([0-6][0-9]{2}|7([0-3][0-9]|4[0-7])))))
# the sub-regex above matches the range from 0 to 214747
([.][0-9]{2})? # this matches the optional two decimals
)
| # or this one:
214748([.]00)? # 214748, with optional zeroes
)
$ # match end of line
你有它,一个过于复杂的正则表达式,看起来是一场噩梦,更不用说维护了。如果您需要更改范围,则需要大量工作。
我希望这个怪物不鼓励将正则表达式用于此任务。按照其他人说的去做,并使用适当的工具进行处理。如果需要正则表达式,请告诉他们这是一个可怕的想法,并要求他们修复要求。