Java регулярное выражение для сохранения определенных закрывающих тегов - PullRequest
0 голосов
/ 03 февраля 2010

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

Код кажется достаточно простым:

String stringToParse = "<body><xml>some stuff</xml></body>";
Pattern pattern = Pattern.compile("</[^(a|em|li)]*?>");
Matcher matcher = pattern.matcher(stringToParse);
stringToParse = matcher.replaceAll("");

Однако, когда он запускается, он пропускает закрывающий тег «xml». Кажется, что пропускается любой тег, где в скомпилированной группе есть соответствующий символ (a | em | li), т.е. если я удаляю «l» из «li», это работает.

Я ожидаю, что это вернет следующую строку: "<body><xml>some stuff" (я делаю дополнительный анализ, чтобы удалить открывающие теги, но для примера оставлю это простым).

Ответы [ 3 ]

4 голосов
/ 03 февраля 2010

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

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

"</(?!a|em|li).*?>"

Но это не будет правильно обрабатывать ряд случаев:

  • Комментарии, содержащие вещи, похожие на теги.
  • Теги как строки в атрибутах.
  • Теги, которые начинаются с a, em или li, но на самом деле являются другими тегами.
  • Прописные буквы.
  • и т.д ...

Вероятно, вы можете исправить эти проблемы, но вам нужно подумать, стоит ли это того или нет, или было бы лучше найти решение, основанное на правильном парсере HTML.

1 голос
/ 03 февраля 2010

Я бы действительно использовал для этого подходящий парсер (например, JTidy ).Вы не можете анализировать XML / HTML с помощью регулярных выражений, так как он не является регулярным, и не существует крайних случаев.Я бы предпочел использовать синтаксический анализ XML, доступный в стандартном JDK (JAXP) или в подходящей сторонней библиотеке (см. Выше), и соответственно настроить ваш вывод.

См. этот ответ для более страстной информации о.парсинг XML / HTML с помощью регулярных выражений.

0 голосов
/ 03 февраля 2010

Вы не можете использовать чередование внутри класса символов.Класс символов всегда соответствует одному символу.

Скорее всего, вместо этого вы хотите использовать отрицательный взгляд вперед или назад:

"</(?!a|em|li).*?>"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...