代码之家  ›  专栏  ›  技术社区  ›  gary

正则表达式用于测试逗号的正确使用

  •  2
  • gary  · 技术社区  · 16 年前

    如果逗号存在于我的一个字符串中,那么它后面必须是空格或正好三位数字:

    • 有效:,\ s

    但是,如果逗号后面跟着任何其他模式,那么它就是一个错误:

    • 无效:,\D
    • 无效:,\d\d

    Regex CommaError = new Regex(@",(^(\d\d\d)|\S)"); // fails case #2

    if (CommaError.IsMatch(", ")) // should NOT match
        Console.WriteLine("failed case #1");
    if (CommaError.IsMatch(",234")) // should NOT match
        Console.WriteLine("failed case #2");
    if (!CommaError.IsMatch("0,a")) // should match
        Console.WriteLine("failed case #3");
    if (!CommaError.IsMatch("0,0")) // should match
        Console.WriteLine("failed case #4");
    if (!CommaError.IsMatch("0,0a1")) // should match
        Console.WriteLine("failed case #5");
    

    但是我上面给出的正则表达式失败了案例2(它在不应该匹配的时候匹配)。

    我花了几个小时调查这件事,并在网上搜索了类似的规则,但遇到了困难。我的正则表达式有什么问题?

    更新:Peter发布了一条评论,其中包含一个按照我想要的方式工作的正则表达式:

    Regex CommaError = new Regex(@",(?!\d\d\d|\s)");
    

    if (!CommaError.IsMatch("1,2345")) // should match
        Console.WriteLine("failed case #6");
    
    2 回复  |  直到 16 年前
        1
  •  5
  •   Laurence Gonsalves    15 年前

    ^ 表示不在字符类内(例如: [^a-b]

    对你来说,最简单的事情就是反转if语句中的条件。

    ,(?!\d\d\d(?!\d)|\s)
    

    在不支持否定断言的正则表达式语法中,你仍然可以做你想做的事情,但否定匹配越大,正则表达式就越复杂。如:

    ,($|[^ \d]|\d$|\d[^\d]|\d\d$|\d\d[^\d]|\d\d\d\d)
    

    基本上,你必须列举所有的坏情况。

        2
  •  0
  •   krcko    16 年前

    你试图用哪种语言来做这件事?这是perl适配的正则表达式来匹配这种情况: ,(?!(\s|\d{3}[^\d])) 后跟空格或精确的3位数字,因此如果字符串与此正则表达式匹配,则无效)