Регулярные выражения - символ совпадения не между двумя строками - PullRequest
0 голосов
/ 29 января 2020

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

Рассмотрим следующую строку.

This is short & [tag]fun & interesting[/tag].

Я хочу заменить любой символ амперсанда то есть НЕ внутри элементов тега с символом @. Результат должен быть таким, как показано ниже.

This is short @ [tag]fun & interesting[/tag].

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

/(?<!\[tag\])&(?!\[\/tag\])/g

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

Есть ли регулярное выражение, которое выполнит sh того, что я хочу здесь?

1 Ответ

2 голосов
/ 29 января 2020

Это работает даже с вложенным тегом:

  • Найти: \[(\w+)\].+?\[/\1\](*SKIP)(*FAIL)|&
  • Заменить: @

Демо & объяснение

Как это работает:

  • \[(\w+)\].+?\[/\1\] пытается сопоставить открывающий и закрывающий тег с некоторыми данными внутри
  • (*SKIP)(*FAIL) если тег найден, то отбросить его
  • | иначе
  • & соответствовать амперсанду. На данный момент мы уверены, что он не находится внутри тега.

К сожалению, это не работает с Java, но это требование было добавлено только после того, как я ответил.

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