2015-04-23 4 views
0

В настоящее время я не хочу ниже строку передать регулярное выражениеRegex ошибка выражение

REFER TO MTF#Y2015-19555 

регулярное выражение

(.)\\1{2,} 

image1

фото я прикрепил оказалось, что это невозможно прошло regex, моя программа теперь случилась, что эта строка соответствует регулярному выражению, я хочу знать, что с ним произошло

image2

+1

Каковы ваши критерии для соответствия строкам? Прямо сейчас вы захватываете символ, который повторяется 2 или более раз, таким образом «555» захватывается. Первый скриншот показывает проблему с вашим тестом: вы используете двойную обратную косую черту, в то время как вы должны использовать 1. –

+0

На самом деле это не мой проект, я пытаюсь его улучшить, и REFER TO MTF # Y2015-19555 is невозможно совместить с этим регулярным выражением, , но в редакторе .net framework 2.0 regex пусть это пройдет это регулярное выражение –

ответ

0

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

В то время как ваш регулярное выражение-тестер получает (.)\\1{2,}, .NET Framework Regex получает (.)\1{2,}, потому что "\\" становится \. Вы можете исправить это, изменив свой шаблон следующим образом: string pattern = "(.)\\\\1{2,}"; или отключите escape-символы, используя string pattern = @"(.)\\1{2,}";.

Вы можете видеть разницу, рассматривая другой шаблон, такой как \w.

Regex.Match("\w", myTestString); 

Это вызовет ошибку компиляции, поскольку "\w" содержит неизвестную последовательность эвакуации (строка вычисляется во время разработки). Чтобы исправить ошибку, я добавляю @ перед строкой, и компилятор удовлетворен.

Regex.Match(@"\w", myTestString); 

В вашем случае, вы не получите сообщение об ошибке, потому что "\\" еще допустимая строка. Но, как вы испытали,

Regex.Match("\\", myTestString); 
Regex.Match(@"\\",myTestString); 

может привести к разным результатам.

+0

ok, позвольте мне объяснить, что я действительно хочу в этом вопросе, что я хочу, знаю, почему REFER TO MTF # Y2015-19555 эта строка может передать это регулярное выражение, Я не хочу, чтобы он проходил, и из самого изображения он показывает строка действительна для этого регулярного выражения –

+0

Хорошо, позвольте мне попытаться объяснить это. В случае 1 (ваш инструмент тестирования регулярных выражений): шаблон является '(.) \\ 1 {2,}'. Это означает, что каждый вход соответствует совпадению, который содержит любой символ, за которым следует один '\\' и два или более '1' s. Второй случай: шаблон (оцененная строка) - '(.) \ 1 {2,}'. Обратите внимание на отсутствие '\\' в шаблоне. Теперь каждый вход соответствует, который содержит группу (окруженную скобками), состоящую из одного символа ('.'). Группа получает индекс 1 '\ 1'. Сама группа должна повторяться два или более раз (но не один и тот же символ). В матчах 'REFER TO MTF # Y2015-19555'' 555'. –

0

Если ваше намерение запретить любые повторяющиеся цифры, вы можете задать условие для всего матча с отрицательным взглядом упреждающим:

string pattern = @"^(?!.*(\d)\1.*$).+$"; 

Испытан в Expresso:

enter image description here

+0

Помог ли мой ответ решить вашу проблему? Как я уже сказал, ваше исходное регулярное выражение захватывает символ, который повторяется 2 или более раз, таким образом «555» захватывается. Мое регулярное выражение не позволяет повторить повторение числа. Пожалуйста, дайте мне знать, каковы ваши критерии соответствия, и я буду рад продемонстрировать решение C# и объяснить его вам. –