2012-03-06 2 views
4

У меня есть коды для соответствия с очень простым рисунком строк: XXnnnnnnnnn (2 alphanumeric, 9 numeric).Регулярное выражение, исключая подшаблоны

Я использую это регулярное выражение: \w{2}\d{9}.

Теперь я должен excude из сопоставления любой строки, которая начинается с постоянным маркером «AY», и любая строка с 11 повторным символом (например, «11111111111» или «00000000000»).

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

+0

Вы используете это регулярное выражение в рамках какого-либо языка программирования? Мне кажется, что было бы проще и понятнее проверить это с помощью языка. –

+0

javascript tag! –

+0

Не было этого тега изначально =) –

ответ

5

Попробуйте

\b(?!AY)(?!(\w)\1{10})\w{2}\d{9}\b 

Посмотреть here on Regexr

В основном я добавил только \bword boundaries в свое регулярное выражение, чтобы избежать частичного совпадения.

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

(?!AY) утверждение не выполняется, если шаблон начинается с «AY»

(?!(\w)\1{10}) утверждение не выполняется, если первое слово символ повторяется еще 10 раз.

Lookaround assertions on regular-expressions.info

+0

Он отлично работает. –

2

Вы можете использовать нулевую ширину смотреть вперед matchers исключить эти два случая.

Не соответствие AY легко:

(?!AY) 

Не соответствие 11 из одних и тех же персонажей гораздо сложнее. Вам либо нужно использовать обратные ссылки (это означает, что регулярное выражение не является строго регулярным больше), либо вы можете явно указывать на каждую цифру.

(?!0{11}|1{11}|2{11}|…|9{11}) // 11 zeros, or 11 ones, or 11 twos, … 
(?!(.)\1{10}) // A character, followed by itself 10 more times. 

Так что бы полное регулярное выражение:

(?!AY)(?!(.)\1{10})\w{2}\d{9} 
+0

+1 для почти того же решения, что и у меня! – stema

Смежные вопросы