我是Regex的新手,我想知道如何通过C#中的Regex检测数字,它始终以以下格式显示:#,###
例如:2 000,000
进入2,000
例如:15 000.000
进入15,000
例如:6.700
进入6,700
例如:.3.3.3
进入0,300
这些是我为验证做的一些例子
答案 0 :(得分:1)
正如评论所示,问题不是很清楚。 为了使您的示例正常工作,您可以使用例如
(?:(?<int>\d+)[ .,]?|[.,])
(?<frac>\d+)?
(?:[ .,]\d+)*
匹配&#34;整数部分&#34;和&#34;小数部分&#34;除以.
,,
或(有线,但这是我从您的示例中读到的内容 - 自
15 000.000 => 15,000
和6.700 => 6,700
我假设逗号分隔符到处)。
我很确定我做不到!至少不完全。您提供的示例看起来像具有不同千位分隔符的数字,但它似乎没有系统。
但是,这是您与上面的正则表达式匹配的内容:
int | | frac | anything else ----+-+------+-------------- 2 | | 000 | ,000 15 | | 000 | .000 6 |.| 70 | |.| 3 | .3.3
此外,它匹配没有小数部分的数字。
(?:(?<int>\d+)[ .,]?|[.,])
匹配小数(一个或多个)并将它们存储在名为int
的组中。之后匹配可选的,
.
或,
。
OR
匹配.
或,
。
(?<frac>\d+)?
可选择匹配小数部分(一个或多个小数)。
(?:[ .,]\d+)*
匹配,
.
或,
以及一个或多个小数(重复此零次或多次)。
最后一个是防止例如.3.3.3
在后续电话中匹配。
然后你可以使用MatchEvaluator-Function(这里以委托的形式)来替换值。
var rx = new Regex(@"
(?:(?<int>\d+)[ .,]?|[.,])
(?<frac>\d+)?
(?:[ .,]\d+)*
",
RegexOptions.IgnorePatternWhitespace
);
var deDE = new System.Globalization.CultureInfo("de-DE");
text = rx.Replace(text, delegate(Match match) {
int integral;
int fraction;
int fraclen = match.Groups["frac"].Length;
int.TryParse(match.Groups["int"].Value, out integral);
int.TryParse(match.Groups["frac"].Value, out fraction);
var val = integral + fraction / Math.Pow(10, fraclen);
return String.Format(deDE, "{0:0.000}", val);
});
每次比赛都会调用该函数。在里面,我读出组,将它们转换为整数,然后用integral + fraction / Math.Pow(10, fraclen)
创建匹配的值(整数部分+分数部分除以10^len
,其中len
是字符串长度分数部分,因此&#34; 70&#34;通过计算70/10^2 == 70/100 == 0.7
)变为0.7。
最后,我使用CultureInfo String.Format
返回de-DE
。这样做是因为在德国你使用,
作为十进制分隔符。还有其他的 - 还有很多其他方法可以输出这样的数字..
这只是一个例子。