需要具有多个条件的正则表达式

时间:2017-02-27 05:14:49

标签: regex

我需要以下条件的正则表达式

  • 它应该接受最多5位数,然后最多3位小数
  • 可能是否定的
  • 它可以为零
  • 它只能是数字(最多5位数)
  • 它可以为null

我已经尝试过但不是,它没有满足所有条件

@"^([\-\+]?)\d{0,5}(.[0-9]{1,3})?)$"

E.g。最大值可以保持从-99999.999到99999.999

3 个答案:

答案 0 :(得分:1)

使用此正则表达式:

^[-+]?\d{0,5}(\.[0-9]{1,3})?$

我这里只做了两处改动。首先,通常需要转义字符类中的任何字符,除了打开和关闭括号,或者可能是反斜杠本身。因此,我们可以使用[-+]来捕获初始加或减。其次,你需要在正则表达式中转义点,告诉引擎你想要匹配一个文字点。

但是,我可能会将这个正则表达式说成如下:

^[-+]?\d{1,5}(\.[0-9]{1,3})?$

这将匹配一到五位数字,后跟一个可选的小数点,后跟一到三位数字。

请注意,我们希望捕获以下内容:

0.123

但不是

.123

即。如果没有至少一个数字作为前缀,我们不想捕获一个前导小数点。

在这里演示:

Regex101

答案 1 :(得分:0)

我假设您在C#中使用符号表示这样做。这里有一些可以用来测试表达式的代码,有两处更正:

  1. 你必须逃避点,否则它意味着"任何角色"。因此,\.代替.
  2. 有一个无关紧要的括号阻止表达式编译
  3. C#:

    var expr = @"^([\-\+]?)\d{0,5}(\.[0-9]{1,3})?$";
    var re = new Regex(expr);
    string[] samples = {
        "",
        "0",
        "1.1",
        "1.12",
        "1.123",
        "12.3",
        "12.34",
        "12.345",
        "123.4",
        "12345.123",
        ".1",
        ".1234"
    };
    foreach(var s in samples) {
        Console.WriteLine("Testing [{0}]: {1}", s, re.IsMatch(s) ? "PASS" : "FAIL");
    }
    

    结果:

    Testing []: PASS
    Testing [0]: PASS
    Testing [1.1]: PASS
    Testing [1.12]: PASS
    Testing [1.123]: PASS
    Testing [12.3]: PASS
    Testing [12.34]: PASS
    Testing [12.345]: PASS
    Testing [123.4]: PASS
    Testing [12345.123]: PASS
    Testing [.1]: PASS
    Testing [.1234]: FAIL
    

答案 2 :(得分:0)

  

最多应接受5位数

[0-9]{1,5}
  

然后最多3位小数

 [0-9]{1,5}(\.[0-9]{1,3})?
  

它可能是否定的

 [-]?[0-9]{1,5}(\.[0-9]{1,3})?
  

它可以为零

已经涵盖。

  

它只能是数字(最多5位数)

已经涵盖。 '最多5位数的地方'与你的第一条规则相矛盾,后者允许使用5.3。

  

它可以为null

未涵盖。我 强烈 建议您删除此要求。即使你的意思是“空白”,我真诚地希望你这样做,你应该事先单独检测这个案例,因为你肯定要以不同的方式处理它。

您的正则表达式包含^$。我不知道为什么。您指定的规则中没有关于行开头或行尾的信息。它还允许使用前导+,这在您的规则中也未指定。