货币范围正则表达式

本文关键字:正则表达式 范围 货币 | 更新日期: 2023-09-27 18:03:02

我试图在正则表达式字符串中找到正确格式化的货币或数字的范围。我碰巧使用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)

我错过了什么?用正则表达式这样做是不是很愚蠢?

货币范围正则表达式

给你,伙计

(?<=^|'s)'$?'d+(('.'d{2})?(k|M)|(,'d{3})*)'b's*(to|-|and )'s*'$?'d*(('.'d{2})?(k|M)|(,'d{3})*)('s|$)

看它的作用

这部分

'd+(('.'d{2})?(k|M)|(,'d{3})*)

正在自我重复。所以最好将它保存在一个常量中,并将这个正则表达式连接在一起。

String moneyPattern = @"'d+(('.'d{2})?(k|M)|(,'d{3})*)";
String rangeConnectorPattern = @"'b's*(to|-|and'b)'s*";
String moneyRangePattern = @"(?<=^|'s)"+ 
    moneyPattern + rangeConnectorPattern +  moneyPattern +
    "('s|$)";

不需要编写解析器。