我正在使用各种正则表达式循环遍历数千个字符串以检查简单错误.我想添加一个正则表达式来检查逗号的正确使用.
如果我的一个字符串中存在逗号,那么它必须后跟空格或正好三位数:
但是如果逗号后跟任何其他模式,那么这是一个错误:
到目前为止,我提出的最好的正则表达式是:
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)
在大多数正则表达式语法中,您只能用于^表示不在字符类(例如[^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)
基本上你必须列举所有不良案例.
| 归档时间: |
|
| 查看次数: |
594 次 |
| 最近记录: |