регулярное выражение для проверки правильности использования запятых - PullRequest
2 голосов
/ 31 октября 2009

Я перебираю тысячи строк с различными регулярными выражениями, чтобы проверить наличие простых ошибок. Я хотел бы добавить регулярное выражение для проверки правильности использования запятых.

Если в одной из моих строк есть запятая, за ней ДОЛЖНЫ следовать пробел или ровно три цифры:

  • действует:, \ 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 ]

5 голосов
/ 31 октября 2009

Вы можете использовать ^ только для обозначения не внутри символьного класса (например: [^a-b]) в большинстве синтаксисов регулярных выражений.

Самое простое, что вам нужно сделать, - это инвертировать условие в вашем операторе if.

Если вы не можете этого сделать по какой-либо причине, вы можете использовать отрицательный прогноз в некоторых синтаксисах регулярных выражений. например:

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

В синтаксисах регулярных выражений, которые не поддерживают отрицательные утверждения, вы все равно можете делать то, что хотите, но чем больше отрицательное совпадение, тем сложнее становится регулярное выражение. например:

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

По сути, вы должны перечислить все плохие дела.

0 голосов
/ 31 октября 2009

На каком языке вы пытаетесь это сделать? Это совместимое с perl регулярное выражение для соответствия такому случаю: ,(?!(\s|\d{3}[^\d])) (оно будет соответствовать запятым , а не с последующим пробелом или точными 3 цифрами, поэтому, если строка соответствует этому регулярному выражению, оно недопустимо)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...