我正在使用各种正则表达式循环遍历数千个字符串以检查简单错误。我想添加一个正则表达式来检查逗号的正确使用。
如果我的一个字符串中存在逗号,那么它必须后跟空格或正好三位数:
但如果逗号后跟任何其他模式,那么这是一个错误:
到目前为止,我提出的最好的正则表达式是:
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");
答案 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>