你能推荐一个更好的替代这个正则表达式吗?

时间:2016-11-21 13:05:49

标签: c# regex

private const string NUMERIC_REGEX = "\\W*([0-9]+)(\\W)?([0-9]*)\\W*"

我发现这个正则表达式正用于我正在进行的项目中。它假设从包含货币的字符串中解析数字。

喜欢“14.22€”=> 14.22

但似乎并不支持这一点。有人可以帮助我调整它以使用特殊货币符号吗?

作为替代方案,我发现这个([\d,.]+)能够满足我的需求,但我不确定我是否错过了任何特殊情况,或者它太过通用了。

3 个答案:

答案 0 :(得分:2)

我不知道你是否想要使用现有的类,但是你可能想尝试使用System.Data.SqlTypes.SqlMoney ...这将确保你的字符串不仅仅被一些正则表达式解析了可能会失败...

使用就像:

SqlMoney money = SqlMoney.Parse("12,03 €");
decimal number = money.Value;

答案 1 :(得分:2)

您的问题的一个好答案是使用正则表达式:

(?:\p{Sc} ?)?([\d,.]+)(?: ?\p{Sc})?

Regex Proof

此正则表达式只是您正在使用的正则表达式的扩展版本。 它的作用是在你的号码之前和之后检查一个可选的货币符号。

匹配货币符号的神奇之处是\ p {Sc},因为您可以找到here和可选空格。

此正则表达式检查非捕获组中的货币符号,这意味着捕获组1将是您的编号。

有关详细说明,请单击此答案中的Regex Proof链接。

答案 2 :(得分:0)

也许是这样的? :

const string PATTERN = @"^(?'num'\d{0,}[\.|,]{0,1}\d{0,})";

online regex

你可以使用它:

match = regex.Match(meInput);
string numStr = match.Groups["num"].Value;
double num = double.Parse(numStr);