正则表达式用于验证多种类型的数字

时间:2015-06-03 14:53:55

标签: c# regex validation

我是Regex的新手,我想知道如何通过C#中的Regex检测数字,它始终以以下格式显示:#,###

例如:2 000,000进入2,000

例如:15 000.000进入15,000

例如:6.700进入6,700

例如:.3.3.3进入0,300

这些是我为验证做的一些例子

1 个答案:

答案 0 :(得分:1)

正如评论所示,问题不是很清楚。 为了使您的示例正常工作,您可以使用例如

(?:(?<int>\d+)[ .,]?|[.,])
(?<frac>\d+)?
(?:[ .,]\d+)*

匹配&#34;整数部分&#34;和&#34;小数部分&#34;除以.,(有线,但这是我从您的示例中读到的内容 - 自15 000.000 => 15,0006.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。这样做是因为在德国你使用,作为十进制分隔符。还有其他的 - 还有很多其他方法可以输出这样的数字..

这只是一个例子。