Я перебираю тысячи строк с различными регулярными выражениями, чтобы проверить наличие простых ошибок. Я хотел бы добавить регулярное выражение для проверки правильности использования запятых.
Если в одной из моих строк есть запятая, за ней ДОЛЖНЫ следовать пробел или ровно три цифры:
- действует:, \ 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");