【发布时间】:2019-06-07 19:51:55
【问题描述】:
我需要在货币字段中标识任何低于 300,000 的值。我创建了一个正则表达式,可以对 100 万以下的任何数字执行此操作,但我需要将其削减为 299,999.99 美元。
100万的代码如下。
^\$?\d{0,3}?\d{0,2},?\d{0,3}(\.(\d{0,2}))?$
【问题讨论】:
-
为什么需要正则表达式?不能用比较运算符吗?
我需要在货币字段中标识任何低于 300,000 的值。我创建了一个正则表达式,可以对 100 万以下的任何数字执行此操作,但我需要将其削减为 299,999.99 美元。
100万的代码如下。
^\$?\d{0,3}?\d{0,2},?\d{0,3}(\.(\d{0,2}))?$
【问题讨论】:
您可以使用以下正则表达式:
^\$[0-2]?[0-9]{0,2},?[0-9]{0,3}(\.[0-9]+)?$
【讨论】:
在这里,正则表达式不是您的最佳选择。
为了说明这一点,我将使用您为 100 万美元的案例发布的正则表达式。在我看来,您正在尝试适应各种条件,包括:
$10 vs. $10.00
$100 vs. 100
$100 vs. $10000
$10,000 vs. $100,000
etc.
但是你这样做的方式允许这样的事情:
$10000000.00
因为:
$ matches ^\$?
100 matches \d{0,3}?
00 matches \d{0,2}
[no comma ] matches ,?
000 matches \d{0,3}
.00 matches (\.(\d{0,2}))?$
(使用https://regex101.com/ 测试)
换句话说,您尝试匹配诸如小数不存在逗号和大数存在逗号,以及可能出现在小数、中数和大数中的各种数字分组会导致正则表达式匹配一个远大于 100 万美元的数字。
虽然正则表达式非常通用,并且现代正则表达式引擎非常强大,但是一个健壮的正则表达式来执行您正在尝试做的事情会很麻烦、难以阅读和难以维护。
它也足够复杂,它会展示正则表达式可以被正确地视为一种编程语言的方式。
但最重要的是,任何正则表达式都是在周围编程语言的上下文中使用的,那么为什么不直接使用编程语言本身的功能呢?可能需要更多的输入,但可能需要更少的时间,而且结果会更容易编写、阅读和维护。
【讨论】:
给你,$300,000.00 - $1,000,000.00
(?<!\S)\$?(3\d{2},?\d{3}|[4-9]\d{2},?\d{3}|10{6}|1,?000,?000)(\.\d{0,2})?(?!\S)
可读版本
(?<! \S )
\$?
( # (1 start)
3 \d{2} ,? \d{3}
| [4-9] \d{2} ,? \d{3}
| 1 0{6}
| 1 ,? 000 ,? 000
) # (1 end)
( # (2 start)
\.
\d{0,2}
)? # (2 end)
(?! \S )
【讨论】: