如果这篇文章重复,我很抱歉,但我已经广泛搜索过,似乎无法找到有效的解决方案。
我正在为C#编写正则表达式。以下是要匹配的标准:
几个例子:
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
我知道这是非常基本的东西,但是我很难让它只匹配货币部分,而不是上面的字符串。
感谢您提供的任何建议
答案 0 :(得分:5)
您当前的表达式与列表中的第四个2.89
和第六个示例(1.63)
不匹配。
相反,您可以使用以下表达式:
^(\()?[0-9]+(?>,[0-9]{3})*(?>\.[0-9]{2})?(?(1)\))$
此表达式匹配行尾^
,然后尝试将可选括号(
与负数匹配,括号将在组中捕获,原因很快就会被清除。
现在它会尝试匹配一个或多个数字[0-9]+
,这应该涵盖所有整数,例如234
,5652
等。
然后它会查找可能的逗号(千位分隔符) ,
,后跟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
答案 4 :(得分:1)
如果目标只是解析小数,decimal.Parse或decimal.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
因此在部分匹配时不匹配。