Выражение регулярного выражения обнаруживает <code>...</code> фрагментов кода - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь обнаружить куски <code>... внутри файла исходного кода HTML, чтобы удалить их из файла.Я использую Java 8 Pattern и Matcher классы для реализации RegEx.Например, этот метод печатает каждый <code>... результат.

protected void printSourceCodeChunks() {
  // Design a regular expression to detect code chunks
  String patternString = "<code>.*<\\/code>";
  Pattern pattern = Pattern.compile(patternString);
  Matcher matcher = pattern.matcher(source);

  // Loop over findings
  int i = 1;
  while (matcher.find())
    System.out.println(i++ + ": " + matcher.group());
}

Типичный результат будет:

1: <code> </code>
2: <code></code>
3: <code>System.out.println("Hello World");</code>

Поскольку я использую специальный символ точка , а порции исходного кода могут содержать разрывы строк (\ n или \ r), блоки кода, включая разрывы строк, обнаруживаться не будут.К счастью, класс Pattern может быть проинструктирован включать разрывы строк в значение точка , просто добавляя

  Pattern pattern = Pattern.compile(patternString, Pattern.DOTALL);

Проблема с этим подходом состоит в том, что только один (поддельный) <code>... обнаружен блок: тот, который начинается с первого вхождения <code> и последнего вхождения в файле HTML.Вывод теперь включает в себя весь HTML-код между этими двумя тегами.

Как я могу изменить выражение регулярного выражения для соответствия каждому отдельному блоку кода?

Предложение решения

Как многовы опубликовали, и для будущих читателей это было так просто, как изменить мое регулярное выражение на

<code>.*?<\\/code>

, так как * принимает все символы до последнего , который он находит.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Вы не используете regex для манипулирования html!

Вместо этого анализируйте html, например, с помощью jsoup , и правильно удаляйте элементы.

String html = "<html><head><title>First parse</title></head>"
        + "<body><p>Parsed HTML into a doc.</p><code>foo</code><code></code><code> </code></body></html>";
Document doc = Jsoup.parse(html);
Elements codes = doc.body().getElementsByTag("code");
codes.remove();
System.out.println(doc.toString());
0 голосов
/ 31 января 2019

Вы можете сделать это с не жадным ?:

String patternString = "<code>.*?<\\/code>"

По умолчанию * будет соответствовать всему, что он получит, с первого вхождения <code> до последнего из .С вопросительным знаком ? он прекратит сопоставление при первом появлении.

Хотя я настоятельно рекомендую не "разбирать" любую структуру с помощью регулярных выражений, лучше использовать специальный анализатор HTML

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