4
我正在尝试使用正则表达式查找格式正确的货币或字符串的范围。我碰巧使用C#,所以正则表达式就是这样格式化的。货币范围正则表达式
例如,我希望能够找到:
$10,000,000 to $20M
$10k-$20k
100.23k - 200.34k
$20000 and $500600
3456646 to 4230405
它不应该匹配:
$10,0000,000 to $20,000,000 //extra zero in first number
20k xyz 40k //middle string does not match a range word
这里是我的正则表达式到目前为止:
(^|\s|\$)([1-9](?:\d*|(?:\d{0,2})(?:,\d{3})*)(?:\.\d*[1-9])?|0?\.\d*[1-9]|0)(|m|k)(?:|\s)(?:|to|and|-|,)(?:|\s)(|\$)([1-9](?:\d*|(?:\d{0,2})(?:,\d{3})*)(?:\.\d*[1-9])?|0?\.\d*[1-9]|0)(\s|m|k)
它似乎工作得很好,但有时会匹配我不指望它的项目。示例:
1985 xyz 1999 //2 matches, both numbers without xyz
$10,000,000 xyz $20000000 //1 match on the $2000000
$10,000,0000 to $20,000,000 //1 match on the $10,000,0000 (extra zero on end)
我错过了什么?用正则表达式来做这件事是愚蠢的吗?
我的看法是,所有不适合80字符行的正则表达式太大,无法读取或调试。一旦你的正则表达式增长得比建议的边界大,我会建议编写一个简单的解析器。 – 2013-03-07 17:34:33
@Pieter是的,我有一种感觉自己变得太久了。一旦你感觉如此接近,很难从它退缩。也许我会尝试提前删除逗号,这会简化它。 – robr 2013-03-07 17:49:13
但是可能会更快:编写(并研究和测试)正则表达式,或者只写一个简单的解析器? – 2013-03-07 17:52:25