Используя Java, я хочу пройти строки текста и заменить все символы амперсанда (&
) со ссылкой на сущность XML &
.
Я сканирую строки текста и затем каждого слова в тексте с классом Сканера. Затем я использую CharacterIterator
выполнить итерации по каждому изображает слова. Однако, как я могу заменить символ? Во-первых, Строки являются неизменными объектами. Во-вторых, я хочу заменить символ (&
) с несколькими символами (amp&;
). Как я должен приблизиться к этому?
CharacterIterator it = new StringCharacterIterator(token);
for(char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
if(ch == '&') {
}
}
Попытайтесь использовать String.replace()
или String.replaceAll()
вместо этого.
String my_new_str = my_str.replace("&", "&");
(Обе замены все случаи; replaceAll
позволяет использование regex.)
Простой ответ:
token = token.replace("&", "&");
Несмотря на имя по сравнению с replaceAll, замена действительно делает replaceAll, это просто не использует регулярное выражение, которое, кажется, в порядке здесь (и от производительности и от хорошей перспективы практики - не используют регулярные выражения случайно, поскольку у них есть требования специального символа, которые Вы не будете уделением внимания).
ответ Sean Bright, вероятно, так хорош, как стоит думать о с точки зрения производительности, отсутствующей некоторое дальнейшее целевое требование к производительности и тестированию производительности, если Вы уже знаете, что этот код является горячей точкой для производительности, если это - то, куда Ваш вопрос прибывает из. Это, конечно, не заслуживает downvotes. Просто используйте StringBuilder вместо StringBuffer, если Вам не нужна синхронизация.
Однако здесь существует несколько более глубокая потенциальная проблема. Выход из символов является известной проблемой, которую там решает много библиотек. Можно хотеть рассмотреть обертывание данных в разделе CDATA в XML, или можно предпочесть пользоваться библиотекой XML (включая тот, который идет с JDK теперь) на самом деле генерировать XML правильно (так, чтобы это обработало кодирование).
Apache также имеет библиотека выхода как часть палаты общин Lang.
StringBuilder s = new StringBuilder(token.length());
CharacterIterator it = new StringCharacterIterator(token);
for (char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
switch (ch) {
case '&':
s.append("&");
break;
case '<':
s.append("<");
break;
case '>':
s.append(">");
break;
default:
s.append(ch);
break;
}
}
token = s.toString();
Можно также хотеть проверить для проверки Вашего не замена возникновения, которое было уже заменено. Можно использовать регулярное выражение с отрицательным предвидением, чтобы сделать это.
, Например:
String str = "sdasdasa&adas&dasdasa";
str = str.replaceAll("&(?!amp;)", "&");
Это привело бы к строке" sdasdasa&adas&dasdasa
".
regex шаблон "& (?! усилитель;)" в основном говорит: Соответствуйте любому возникновению '&'; это не сопровождается 'усилителем';.
Просто создайте строку, которая содержит все рассматриваемые данные, и затем используйте String.replaceAll () как ниже.
String result = yourString.replaceAll("&", "&");
Выход из строк может быть хитер - особенно, если Вы хотите принять unicode во внимание. Я предполагаю, что XML является одним из более простых форматов/языков для выхода, но все еще. Я рекомендовал бы смотреть на класс StringEscapeUtils в Apache палата общин Lang и его удобное метод escapeXml .
При использовании Spring, можно просто звонить HtmlUtils.htmlEscape(String input)
, который обработает '&'; к '&'; перевод.
//I think this will work, you don't have to replace on the even, it's just an example.
public void emphasize(String phrase, char ch)
{
char phraseArray[] = phrase.toCharArray();
for(int i=0; i< phrase.length(); i++)
{
if(i%2==0)// even number
{
String value = Character.toString(phraseArray[i]);
value = value.replace(value,"*");
phraseArray[i] = value.charAt(0);
}
}
}