Заменить все, кроме текста между определенными разделителями, пробелами - PullRequest
0 голосов
/ 19 октября 2018

У меня есть следующий текстовый файл (файл может содержать до нескольких сотен строк):

<% some important text %> something <% important stuff %>
not important stuff <not important stuff>
<% some
       important text
%>

В основном мне нужно заменить все, что не находится между разделителями "<%%>", пробелами.В одной строке может быть несколько вхождений <% text%>.Кроме того, блок <%%> может быть разбит на несколько строк, как в примере выше.Результат должен выглядеть так:

<% some important text %>           <% important stuff %>

<% some
       important text
%>

Любой совет, как с этим справиться?Попробовав регулярные выражения, легко получить <% text%>, но этого недостаточно, мне нужно ставить пробелы везде, где шаблон не совпадает.Буду признателен за любые идеи.

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Разделить весь текст с помощью токена "<%". </p>

Поиск в каждой подстроке литерала "%>".

Заменить все после этой позиции пробелами.

Воссоединить все подстроки.

0 голосов
/ 19 октября 2018

Решение будет работать с \G метасимволом:

(%>\R*|\G\R*(?!<%)).

и заменить на $1 (обратите внимание на конечный пробел)

См. Регулярное выражение живая демонстрация здесь

Распределение по регулярному выражению:

  • ( Начало группы захвата # 1
    • %>\R* Совпадение %> и любые дополнительные конечные символы новой строки
    • | Или
    • \G\R*(?!<%) Совпадение начала строки темы или там, где заканчивается предыдущее совпадение, затем любые необязательные конечные символы новой строки, которым не предшествует <%
  • ) Конец группы захвата # 1
  • . Соответствует одному символу (кроме новой строки)

Java-код:

s = s.replaceAll("(%>\\R*|\\G\\R*(?!<%)).", "$1 ");

См. живую демонстрацию здесь

Отказ от ответственности

Это предполагает, что

  1. У вас нетвложенные блоки

  2. <% и %> разделители правильно спарены

  3. <% и %> никогда не происходит вне блоков

0 голосов
/ 19 октября 2018

Попробуйте это регулярное выражение:

(?s)(?<=%>).*?(?=<%)

Имеет положительный обзор (-ahead), (?s) включает однострочный вариант (может отличаться в вашем движке регулярных выражений).

...