Хотя люди обычно читают a|b
как "a или b", |
не является оператором ИЛИ; это оператор чередование . Он определяет набор альтернатив для того, что может совпадать в этой точке. Более точное чтение будет «или» или «b» (но не оба) ».
Когда вы пишете (and|or)+
, вы добавляете квантификатор +
, что означает «один или несколько из предшествующего атома». В результате вместо сопоставления одного значения, которое может быть либо «и», либо «или», оно будет соответствовать серии значений, каждое из которых может быть «или» или «или». Это будет соответствовать всем следующим:
and
or
andor
orand
andorand
andandorororandorandand
Если вы действительно хотите сопоставить только «и», «или», и «andor» (хотя я не знаю, почему вы хотите), вы бы написали это так:
(and|or|andor) # capture
(?:and|or|andor) # don't capture
в зависимости от того, хотите ли вы захватить соответствующее значение. (Обычная (...)
создает группировку захвата. (?:...)
создает группировку без захвата.)