Символы соответствия регулярному выражению не находятся между двумя указанными c символами или словами - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь заставить это регулярное выражение работать, но у меня получилось только наполовину.

Пока что я мог сделать эту работу:

match every ';' это не находится между '[]'

с этим регулярным выражением: ;(?![^\[]*\])

Но теперь возникает моя проблема ... я также должен добавить это ограничение:

соответствует каждому ';' который не находится между '[' и ']' или 'XXX' и 'ZZZ'

Так, например, в этом тексте:

aaa **;** bbb **;** [ ccc *;* ddd ] eee **;** XXX qweasd *;* qwesad ZZZ

третий и последний '; ' не должно совпадать с

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Если (*SKIP)(*FAIL) является опцией (PHP, PyPi Regex и т.п.), вы можете обойтись с

(?:\[[^][]+\]|XXX.+?ZZZ)(*SKIP)(*FAIL)|;

См. демонстрацию на regex101.com .


Пояснение:
(?:             # non-capturing parenthesis
    \[[^][]+\]  # anything between [ and ]
    |           # or
    XXX.+?ZZZ   # XXX ... ZZZ
)(*SKIP)(*FAIL) # all of this should be skipped
|               # ... or ...
;               # match a ;
1 голос
/ 29 мая 2020

Кажется, этот шаблон работает:

;(?![^[]*\])(?!((?!XXX).)*ZZZ)

Пояснение:

;                   match a semicolon
(?![^[]*\])         assert that we cannot look forward and see a ] without also seeing
                    an opening [
                       -> this implies that the semicolon is not in between []
(?!((?!XXX).)*ZZZ)  assert that we cannot look forward and see ZZZ without
                    first seeing XXX
                       -> this implies that the semicolon is not in between XXX and ZZZ

Демо

Примечание что это решение предполагает, что у вас не будет нигде вложенных скобок [] или вложенных XXX ... ZZZ, а будет только один уровень.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...