【问题标题】:How to validate an integer with regex如何使用正则表达式验证整数
【发布时间】:2018-02-08 00:57:40
【问题描述】:

我有以下正则表达式仅验证整数,^\$?\d{0,10}(.(\d{0,2}))?$ 虽然它正确地将 12 识别为有效整数,但它还验证 12 美元是有效的。如果,我从正则表达式中删除第一个 $ 它也不起作用。

谢谢

【问题讨论】:

  • 该正则表达式似乎用于验证资金输入(保留两位小数)。它不适用于整数,并且在任何情况下它至少有一个钱的错误(使用. 允许像$10x00 这样的输入)。您可能想尝试更合适的方法,例如 Convert.ToInt32
  • 这是稍微超出正则表达式的操作之一。什么构成有效整数会根据文化而发生巨大变化。美国和英国使用相反的小数和千位分隔符。通常 Parse 和 TryParse 用于验证整数 - 通过尝试将其解析为一个。
  • 虽然我同意@Christopher 的观点,即 RegEx 不是验证整数的最佳工具,但可以基于 CultureInfo 构建正确的特定于语言环境的正则表达式(是否好主意有待讨论)。
  • Regex Match Integer Only的可能重复

标签: c# regex


【解决方案1】:

简答

using System;
using System.Text.RegularExpressions;

Console.WriteLine(Regex.IsMatch("1313123", @"^\d+$")); // true

假设我们想要验证一个简单的整数。

对话

如果我们还想为一种或多种文化或其他数字约定包含数千个分组结构,那将更加复杂。考虑以下情况:

  • 10,000
  • 10 000
  • 100,00
  • 100,000
  • -10
  • +10

如需了解挑战,请参阅NumberFormatInfo properties here.

如果我们需要处理特定于文化的数字约定,最好利用Int64.TryParse() 方法而不是使用正则表达式。

示例代码

它是live here. 完整列表of NumberStyles is here。我们可以添加/删除各种NumberStyles,直到找到我们想要的集合。

using System;
using System.Text.RegularExpressions;
using System.Globalization;

public class Program
{
    public static void Main()
    {
        Console.WriteLine(IsIntegerRegex("")); // false
        Console.WriteLine(IsIntegerRegex("2342342")); // true

        Console.WriteLine(IsInteger("1231231.12")); // false
        Console.WriteLine(IsInteger("1231231")); // true
        Console.WriteLine(IsInteger("1,231,231")); // true
    }

    private static bool IsIntegerRegex(string value)
    {
        const string regex = @"^\d+$";
        return Regex.IsMatch(value, regex);
    }

    private static bool IsInteger(string value)
    {
        var culture = CultureInfo.CurrentCulture;
        const NumberStyles style = 
            // NumberStyles.AllowDecimalPoint | 
            // NumberStyles.AllowTrailingWhite | 
            // NumberStyles.AllowLeadingWhite | 
            // NumberStyles.AllowLeadingSign |
            NumberStyles.AllowThousands;

        return Int64.TryParse(value, style, culture, out _);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    相关资源
    最近更新 更多