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

gar*_*ary 2 c# regex

我正在使用各种正则表达式循环遍历数千个字符串以检查简单错误.我想添加一个正则表达式来检查逗号的正确使用.

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

  • 有效:,\ s
  • 有效:,\ d\d\d

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

  • 无效:,\ D
  • 无效:,\ d
  • 无效:,\ d\d
  • 无效:,\ d\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");
Run Code Online (Sandbox Code Playgroud)

但是我上面给出的正则表达式失败了#2(当它不应该匹配时).

我花了几个小时调查这个,并在网上寻找类似的正则表达式,但已经碰到了一堵砖墙.我的正则表达式有什么问题?

更新:彼得发布了一个评论正则表达式按我想要的方式工作:

Regex CommaError = new Regex(@",(?!\d\d\d|\s)");
Run Code Online (Sandbox Code Playgroud)

编辑:好吧,差不多.在这种情况下失败:

if (!CommaError.IsMatch("1,2345")) // should match
    Console.WriteLine("failed case #6");
Run Code Online (Sandbox Code Playgroud)

Lau*_*ves 5

在大多数正则表达式语法中,您只能用于^表示不在字符类(例如[^a-b]:)中.

您最简单的方法是在if语句中反转条件.

如果由于某种原因你无法做到这一点,你可以在一些正则表达式语法中使用负向前瞻.例如:

,(?!\d\d\d(?!\d)|\s)
Run Code Online (Sandbox Code Playgroud)

在不支持否定断言的正则表达式语法中,您仍然可以执行您想要的操作,但负匹配越大,正则表达式就越复杂.例如:

,($|[^ \d]|\d$|\d[^\d]|\d\d$|\d\d[^\d]|\d\d\d\d)
Run Code Online (Sandbox Code Playgroud)

基本上你必须列举所有不良案例.