Следующее выражение будет соответствовать только строки, которые имеют либо simple
или complex
в них, но только тогда, когда либо появляется только один раз:
^(?=(?:(?!simple).)*?(?:(?:simple)(?:(?!simple).)*?$|$))(?=.*?(?:simple|complex))(?=(?:(?!complex).)*?(?:(?:complex)(?:(?!complex).)*?$|$)).*?$
Убедитесь, что выражение находится в режиме нескольких линий в любом вы используя для реализации этого (большую часть времени по умолчанию используется режим с несколькими линиями).
Матчи:
using simple with complex here
eggs are both complex and simple all at once
simple
complex
some simple things
some complex things
Не соответствует:
this is irrelevant
eggs are both complex and simple all at once said simple simon
simple simple
complex complex
Выражение может быть разбита на три требования:
(?=.*?(?:simple|complex))
Строка должна содержать либо 'простой' или «комплекс»
(?=(?:(?!simple).)*?(?:(?:simple)(?:(?!simple).)*?$|$))
линия может иметь только один или не возникновение простого
(?=(?:(?!complex).)*?(?:(?:complex)(?:(?!complex).)*?$|$))
линия может иметь только один или не возникновение сложных
не использовать глобальный модификатор, или '^ (? :(?! \ bsimple \ b | \ bcomplex \ b).) * \ K (?: simple | complex) 'https://regex101.com/r/sY6eW6/3 –
Не могли бы вы объяснить это? Есть ли способ совпадения только один раз простое значение, если оно используется, а не два раза? ' –
Вы хотите сказать, что для успешного сопоставления строка должна иметь только одно вхождение' simple' и только одно вхождение 'complex'? Если это так, вы можете использовать: '^ (? = (? :(?! просто).) *? (?: simple) (? :(?! просто).) * $) (? =^(? :(? !) *? (?: complex) (? :(?! complex).) * $). *? $ ' – JonM