【问题标题】:Need a Regex for comma separated number list需要逗号分隔的数字列表的正则表达式
【发布时间】:2011-01-19 19:47:35
【问题描述】:

这对于有经验的正则表达式编写者来说应该很简单,但我写的不多,所以....

我想对 C# MVC 表单上的文本框进行输入验证,可能使用 javascript 或 jquery。

我想将输入限制为逗号分隔的整数列表。该列表必须以 >= 0 的数字开头,后跟逗号,然后重复此模式。该列表可能以逗号结尾,也可能不以逗号结尾:

1,2,444,5, - 传球

1,2,444,5 - 传球

,1,2,444,5, - 失败

,1,2,444,5 - 失败

1,,2,444,5 - 失败

1,,2,444,5,, - 失败

我写了这个:^([0-99],?)+$ 并在 regexlib.com 上对其进行了测试,它似乎可以工作,但测试器返回 2 个匹配项,我不确定这意味着什么。由于它在上面的失败案例中失败,我认为简单的输入验证是安全的。有更好的模式吗?

不太重要的问题:为什么在 0-99 范围内允许 444?

【问题讨论】:

  • 它允许 444,因为您将 , 设为可选。所以它可以先匹配 44,然后是 4。
  • 实际上我认为它匹配4 然后4 然后4,。它不会将99 视为“九十九”,而是将其视为“99”。
  • @Beta 将其视为0-99,这是多余的(与只是说[0-9] 相同)。

标签: regex asp.net-mvc-2 validation csv


【解决方案1】:

范围运算符仅用于指定 ASCII 字符的范围,而不是数字。试试这个:

^([0-9]+,?)+$

【讨论】:

    【解决方案2】:

    你的正则表达式是错误的:它说“从字符串的开头,匹配一个或多个组,使得该组由数字 0 到 9 组成(其他 9 是多余的),可能后跟逗号。直到最后”。

    这显然不是你想要的。你需要这个:

    ^\d+(?:,\d+)*$

    它匹配:“从字符串的开头匹配一个或多个数字,可选地后跟由逗号组成的组,后跟一个或多个数字,直到字符串的末尾”。这些组是非捕获组,因此您最多可以进行一场比赛。

    【讨论】:

    • 那个不允许在字符串末尾使用逗号。这在其他情况下很有价值,但不是我的具体情况。不过,感谢您的帮助。
    • 好的。如果你想要单个匹配,只需使用非捕获组 (?: ) 而不是 ( )
    【解决方案3】:

    ^(([0-9],?)+)$ 或 ^([0-9],?)+$/ 取决于重用

    测试

    my %a=qw(1,2,444,5,  Pass
    1,2,444,5  Pass
    ,1,2,444,5, Fail
    ,1,2,444,5  Fail
    1,,2,444,5  Fail
    1,,2,444,5,, Fail
    );
    
    while(my ($k,$v)=each(%a)) {
        $vv = ($k =~ m/^(([0-9],?)+)$/) ? "Pass" : "Fail";
        print "$k $v $vv\n";
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      相关资源
      最近更新 更多