Регулярное выражение, эквивалентное XOR
Я пытаюсь придумать регулярное выражение, которое будет принимать любое из перечисленных ниже значений, за исключением случаев, когда присутствует NONE. Нечто похожее на XOR, где, если NONE присутствует, больше ничего не будет принято, и наоборот.
Это то, что я имею до сих пор... но это на самом деле не навязывает взаимную исключительность NONE:
(НЕТ)|((FOO|BAR| СПАМ)(?\|?(FOO|BAR| СПАМ))*)
Какие-либо предложения?
Спасибо!
1 ответ
Вы можете использовать это регулярное выражение:
^(?!.*NONE)(?:.*(FOO|BAR|SPAM))*
Начинается с negative look ahead
для: любое число любого символа с последующим 'NONE'
,
Если этот тест не пройден (НЕТ найдено), то совпадение не будет выполнено. Если нет 'NONE'
найден, он движется и соответствует: с начала строки любое число любого символа, за которым следует любое из ваших слов. Эта часть повторяется.
Edit
чтобы разрешить NONE самостоятельно:
^NONE$|^(?!.*NONE)(?:.*(FOO|BAR|SPAM))*
Теперь он начинается с проверки того, что "NONE" один (что нормально).