2010-06-22 4 views
0

У меня есть строка, которая должна быть проверена.Регулярное выражение. Начинается с и не равно

Первые два символа должны быть составлены A-G или Z, но не могут быть следующей комбинацией: GB или ZZ.

Как выразить это в регулярном выражении?

+1

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

ответ

8

Отрицательный lookbehind наилучшим образом подходит для этого.

[A-GZ]{2}(?<!GB)(?<!ZZ) 

Пояснение:

[A-GZ]{2} точно соответствует два символа, оба из которых должны быть-G или Z.
(?<!GB) соответствует только если предыдущие два символа совпадающая не было ГБ.
(?<!ZZ) соответствует только двум предыдущим символам, но не ZZ.

Отрицательный lookbehind, как и все операции lookahead и lookbehind, равен нулю, что означает, что он не меняет позицию курсора. Вот почему вы можете объединить две строки подряд, как и я. Мне нравится это лучше, чем |, потому что он дает понять, что два случая, которые не разрешены. И выполнение этого дважды должно иметь примерно такой же эффект выполнения, как и | оператора в одном взгляде.

+4

А также одна из более редких особенностей регулярных выражений (не работает, например, в JavaScript). Отрицательные образы более широко поддерживаются и одинаково просты: '^ (?! GB) (?! ZZ) [A-GZ] {2}' - также добавил '^', так как он указал «первые два символа» – gnarf

+0

Good точки gnarf. – jdmichal

+0

Что делать, если первые два символа должны оцениваться отдельно? [A-GZ] {1} [A-GXZ] {1} (? iBiryukov

3
^([A-F][A-GZ]|G[AC-GZ]|Z[A-G]).* 
+0

Наиболее совместим со многими вариантами регулярных выражений ... добавьте '^' к началу, чтобы получить часть «первых двух символов» для проверки ... – gnarf

+0

@gnarf. '. *' В конце означает, что это полнотекстовый match –

+0

@Michael Mrozek - Извините, но '^' и '$' никогда не подразумеваются в каких-либо языках регулярного выражения, которые я использую ... Вышеупомянутый шаблон может совпадать с 'ZZ AA aasdfasd', он просто будет соответствовать только' AA aasdfasd ' – gnarf

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