Java / Парсинг: как заменить & символ, но не HTML-коды - PullRequest
5 голосов
/ 24 февраля 2011

Мне нужно заменить все символы "&" на "&#38" в моем текстовом файле, но не HTML-коды, такие как & или "

Я сейчас использую row = row.replace("& ", "&#38");

но, как я уже сказал, HTML-коды заменяются, например. " и я не хочу этого .. спасибо

пс. Я не могу добавить пробелы после &, потому что мне нужно заменить его словами, такими как M&M или Ella & David

Ответы [ 5 ]

4 голосов
/ 24 февраля 2011

Вы можете попробовать регулярное выражение, например,

row = row.replaceAll("&(?![#a-zA-Z0-9]+;)", "&");

Регулярное выражение заменяет &, учитывая, что оно не , за которым следует a sequence of '#a-zA-Z0-9' ending with ';'

1 голос
/ 24 февраля 2011

Нет общего решения, так как в вашем тексте могут быть такие вещи, как

&

, что может означать либо один амперсанд, либо неправильный способ сказать &, который должен быть выражен как

&

Однако последнее весьма маловероятно (если вы не избежите некоторого HTML).

Так что попробуйте что-то вроде

row = row.replaceAll("&(?!(?:\\#|amp|quot|nbsp|\\d+);)", "&");

Кстати, &#38 отсутствует последняя точка с запятой. Предпочитайте & использованию кодов ASCII.

0 голосов
/ 24 февраля 2011

Это решение более сложное, но я чувствую, что оно полностью защищено, в то время как решения регулярных выражений могут быть не на 100% правильными (согласно известному "не используйте регулярное выражение для потока стекового потока HTML" ).

Использование Jsoup :

public static String html2text(String html) {
    return Jsoup.parse(html).text();
}

Это даст вам текст, содержащий только нужные вам амперсанды, а не остальные.

Тогдасоздайте карту, содержащую с левой стороны фразы, такие как M&M и Ella & David, а затем с правой стороны фразы M&M и Ella & David

Последний шаг - возврат кисходный текст HTML и замена строк в LHS карты на строки из RHS.

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

0 голосов
/ 24 февраля 2011

Попробуйте

String replacedAmpersands = row.replaceAll("&(?!(?:#\\d+|\\p{L}+);)", "&")

Это заменит только амперсанды, за которыми не следует #\d+; (хэш, цифры, точка с запятой) или \p{L}+; (буквы, точка с запятой).

0 голосов
/ 24 февраля 2011

Шаблон "& " должен быть "&\\s", поскольку в пробеле также есть идентификатор шаблона.

Таким образом, строка должна выглядеть так: row = row.replace("&\\s", "&#38");

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