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

时间:2009-10-31 17:24:38

标签: 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");

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

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

更新:彼得发布了一个正则表达式的评论,它按照我想要的方式运行:

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

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

答案 1 :(得分:0)

您尝试使用哪种语言?这是perl-comaptible正则表达式来匹配这样的情况:,(?!(\s|\d{3}[^\d]))(它将匹配逗号后跟空格或精确3位数,所以如果字符串匹配此正则表达式则无效)< / p>