Как работает отрицательное выражение регулярного выражения, если вставить выражение if? - PullRequest
1 голос
/ 06 ноября 2019

Я пытаюсь использовать группы захвата регулярных выражений и обходные пути для сопоставления всех вхождений определенного слова в последовательности, но только если оно не окружено символами & и;символы (т.е. я не хочу захватывать word из &word;, но я делаю из &word или word;).

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

(&[^;&]*)?(amp)(?(1)(?!;))

При использовании в этой строке: >amp; &amp; amp &amp; &amp< Я ожидал, что только первый, третий и пятый усилители будут согласованы из-за отрицательного внешнего вида, но неожиданно все они сопоставляются только с символами &, которые сопровождаются ;.

https://regex101.com/r/ilAAVb/1

Я делаю здесь какую-то очевидную ошибку или ищите обходные пути, если предложение работает только для группы, которую проверяет это предложение?

Редактировать: Исправлено то, что мне нужно извлечь из предложения.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Используйте (*FAIL)(*SKIP) глаголы, попробуйте сопоставить &word;, если найдено, отмените совпадение, затем попробуйте сопоставить amp

&.+?;(*SKIP)(*FAIL)|amp

Демонстрация и объяснение

0 голосов
/ 06 ноября 2019

Возможно не самый элегантный, но это работает:

(&\b\w+\b(?!;)|(?<!&)\b\w+\b(?!;)|(?<!&)\b\w+\b;)

(&\b\w+\b(?!;) для & в начале, но не ; в конце

(?<!&)\b\w+\b(?!;) для нет & в начале и нет ; в конце

(?<!&)\b\w+\b;) для нет & в начале, но ; в конце

...