[Регулярные выражения] Как совмещать шаблоны поиска через И, ИЛИ, НЕ?

xintrea

Новичок
Здравствуйте!

Вначале опишу задачу.

Нужно найти соответствие строки по следующему макрокоду:

Код:
((НЕ abc)И(НЕ def)И(НЕ ghi))xyz
То есть, строки, удовлетворяющие регвыру, могут выглядеть так:

Код:
jklxyz
cbaxyz
adgxyz
Строки, не удовлетворяющие регвыру, выглядят так:

Код:
abcxyz
defxyz
ghixyz
Задача: нужно написать выражение, повторяющее поведение приведенного выше макрокода.


PS:

Дело в том, что я не понимаю две вещи:

1. Как в регвырах написать "несоответсвие подстроке". Несоответсвие символу или несоответсвие диапазону символов - это понятно как делать. А как сделать несоответсвие подстроке, например, что-то типа !(abc) - непонятно.

2. Как связывать куски шаблонов через логическую И - тоже непонятно. В регвырах есть только операция ИЛИ.
 

Ярослав

Новичок
xintrea
1. Негативная ретроспективная проверка
2. "И" тут ненужно.Просто задавайте дальше условия, это и будет "И"
 

AmdY

Пью пиво
Команда форума
разбейте задачу на две
1. разбивка регуляркой строки на токены
2. полученный массив прогоняете в цикле и ищете те элементы, которые удовлетворяют вашей логике
 

MiksIr

miksir@home:~$
Я тут "внезапно" обнаружил новую мету заменяющую этот самый negative lookbehind и позволяющую делать его неопределенной длины ("классический" работает только для фиксированных паттернов). \K - судя по версиям pcre/php должен быть достаточно давно в 5.2. Может кому пригодится.
 
Сверху