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

本文关键字:数字 正则表达式 类型 种类 验证 用于 | 更新日期: 2023-09-27 17:53:22

我是Regex的新手,我想知道如何在c#中检测Regex的数字,它总是以格式显示:#,###

例:2 000,000 into 2,000

Ex: 15 000.000 into 15,000

示例:6.700 into 6,700

Ex: .3.3.3 into 0,300

这些是我正在做的验证的一些例子

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

正如评论所暗示的,这个问题不是很清楚。为了让你的例子工作,你可以使用例如

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

匹配"整数部分"answers"小数部分"除以., ,(有线,但这是我从你的例子中读出来的-因为6.700 => 6,700int我假设到处都有逗号分隔符)。

我很确定我没有写对!至少不完全如此。您提供的示例看起来像带有不同千位分隔符的数字,但似乎没有系统。

但是,这就是你用上面的正则表达式匹配的内容:

<>之前Int | | frac |其他任何东西----+-+------+--------------2 | | 000 | 00015 | | 000 | .0006 |。| 70 ||。[au:] [au:之前

另外,它匹配不含小数部分的数字。

详细

(?:(?<int>'d+)[ .,]?|[.,])

匹配小数(一个以上)并将它们存储在名为.的组中。匹配可选的.,

匹配.,

(?<frac>'d+)?

可选择匹配分数部分(一个或多个小数)。

(?:[ .,]'d+)*

匹配integral + fraction / Math.Pow(10, fraclen)10^len和一个或多个小数(重复此零或多次)。最后一个是为了防止len的最后部分在后续调用中匹配。

然后你可以使用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);
});

每次匹配时调用该函数。在内部,我读出组,将它们转换成整数,然后用70/10^2 == 70/100 == 0.7(整部分+分数部分除以String.Format,其中de-DE是分数部分的字符串长度,因此通过计算,,"70"变成0.7)创建匹配的值。

最后,我返回CC_28和CultureInfo CC_29。这样做是因为在德国您使用CC_30作为小数分隔符。还有其他方法——还有许多其他方法可以输出这样的数字。

这只是一个例子