货币的正则表达式(没有美元符号,有逗号,有十进制,负数可选括号)

时间:2013-08-30 13:53:32

标签: c# regex

如果这篇文章重复,我很抱歉,但我已经广泛搜索过,似乎无法找到有效的解决方案。

我正在为C#编写正则表达式。以下是要匹配的标准:

  • 货币
  • 没有美元符号
  • 1000分隔符的逗号
  • 十进制
  • 小数点后只有两位数
  • 负数括号

几个例子:

  1,024.12
    500.00
 10,456.23
      2.89
 (8,456.15)
     (1.63)

这是我正在使用的当前模式:

^\(?\d+\,?\d+[.]{1}\d{2}\)?

我认为这种模式可以解决问题,但是,在同一行上有一个由数字和句点构成的字符串与此模式匹配。例如:

123.1234.12345.123456789.12345.123 

我知道这是非常基本的东西,但是我很难让它只匹配货币部分,而不是上面的字符串。

感谢您提供的任何建议

6 个答案:

答案 0 :(得分:5)

您当前的表达式与列表中的第四个2.89和第六个示例(1.63)不匹配。

相反,您可以使用以下表达式:

^(\()?[0-9]+(?>,[0-9]{3})*(?>\.[0-9]{2})?(?(1)\))$

此表达式匹配行尾^,然后尝试将可选括号(与负数匹配,括号将在组中捕获,原因很快就会被清除。

现在它会尝试匹配一个或多个数字[0-9]+,这应该涵盖所有整数,例如2345652等。

然后它会查找可能的逗号(千位分隔符) ,,后跟3位(?>,[0-9]{3})*重复零次或多次,这涵盖了包含千位分隔符的数字。< / p>

然后它会尝试找到一个小数点.,后跟正好2位(?>\.[0-9]{2})?,这当然是可选的,这包括十进制数。

之后,表达式使用(?(1)\)) - 条件构造(?(id/name)yes-pattern|no-pattern) - ,这样如果我们实际匹配一个打开的括号,那么我们应该匹配一个结束的,这可以防止来自匹配不正确的负数的表达式,例如(2.4没有右括号。

最后是字符串$的结尾,以防止部分匹配,例如您的上一个示例。

<强> Regex 101 Demo

答案 1 :(得分:3)

尝试将$添加到正则表达式的末尾,这样您就可以

^\(?\d+\,?\d+[.]{1}\d{2}\)?$

这样你至少只能匹配.之后正好2位数的数字,而你提到的字符串不再匹配。

答案 2 :(得分:3)

\(?\b[0-9]{1,3}(?:,?[0-9]{3})*\.[0-9]{2}\b\)?

将鼠标悬停在表达式here上以获得解释。

答案 3 :(得分:1)

我认为这对你来说是一个很好的解决方案:

^\(?(0|[1-9][0-9]{0,2}(?:(,[0-9]{3})*|[0-9]*))\.[0-9]{2}\)?$

这样可以防止004,2.42

等无意义的数字

enter image description here

答案 4 :(得分:1)

如果目标只是解析小数,decimal.Parsedecimal.TryParse正确设置NumberStyles就可以满足要求。

const NumberStyles numberStyles = NumberStyles.AllowParentheses
                                    | NumberStyles.AllowThousands
                                    | NumberStyles.AllowDecimalPoint;
decimal parsed;
var successful = decimal.TryParse(s, numberStyles, CultureInfo.CurrentCulture, out parsed);

完成测试:

var values = new[]
    {
        "1,024.12",
        "500.00", 
        "10,456.23", 
        "2.89", 
        "(8,456.15)", 
        "(1.63)", 
        "123.1234.12345.123456789.12345.123"
    };

const NumberStyles numberStyles = NumberStyles.AllowParentheses
                                    | NumberStyles.AllowThousands
                                    | NumberStyles.AllowDecimalPoint;
var culture = CultureInfo.CurrentCulture;

foreach (var s in values)
{
    decimal parsed;
    var successful = decimal.TryParse(s, numberStyles, culture, out parsed);

    Console.WriteLine("Successful? {0}; Parsed = {1}", 
        successful, 
        successful ? parsed.ToString() : "?");
}

输出:

Successful? True; Parsed = 1024.12
Successful? True; Parsed = 500.00
Successful? True; Parsed = 10456.23
Successful? True; Parsed = 2.89
Successful? True; Parsed = -8456.15
Successful? True; Parsed = -1.63
Successful? False; Parsed = ?

答案 5 :(得分:0)

你应该试试

^\(?\d+\,?\d+[.]{1}\d{2}\)?\\> 

^\(?\d+\,?\d+[.]{1}\d{2}\)?\b

因此在部分匹配时不匹配。