Как я заменяю символ в строке в Java?

Используя Java, я хочу пройти строки текста и заменить все символы амперсанда (&) со ссылкой на сущность XML &.

Я сканирую строки текста и затем каждого слова в тексте с классом Сканера. Затем я использую CharacterIterator выполнить итерации по каждому изображает слова. Однако, как я могу заменить символ? Во-первых, Строки являются неизменными объектами. Во-вторых, я хочу заменить символ (&) с несколькими символами (amp&;). Как я должен приблизиться к этому?

CharacterIterator it = new StringCharacterIterator(token);
for(char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
       if(ch == '&') {

       }
}
62
задан 5 August 2009 в 21:08

8 ответов

Попытайтесь использовать String.replace() или String.replaceAll() вместо этого.

String my_new_str = my_str.replace("&", "&");

(Обе замены все случаи; replaceAll позволяет использование regex.)

116
ответ дан 31 October 2019 в 13:06

Простой ответ:

token = token.replace("&", "&");

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

ответ Sean Bright, вероятно, так хорош, как стоит думать о с точки зрения производительности, отсутствующей некоторое дальнейшее целевое требование к производительности и тестированию производительности, если Вы уже знаете, что этот код является горячей точкой для производительности, если это - то, куда Ваш вопрос прибывает из. Это, конечно, не заслуживает downvotes. Просто используйте StringBuilder вместо StringBuffer, если Вам не нужна синхронизация.

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

Apache также имеет библиотека выхода как часть палаты общин Lang.

88
ответ дан 31 October 2019 в 13:06
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("&lt;");
            break;
        case '>':
            s.append("&gt;");
            break;
        default:
            s.append(ch);
            break;
    }
}

token = s.toString();
14
ответ дан 31 October 2019 в 13:06

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

, Например:

String str = "sdasdasa&amp;adas&dasdasa";  
str = str.replaceAll("&(?!amp;)", "&amp;");

Это привело бы к строке" sdasdasa&amp;adas&amp;dasdasa".

regex шаблон "& (?! усилитель;)" в основном говорит: Соответствуйте любому возникновению '&'; это не сопровождается 'усилителем';.

8
ответ дан 31 October 2019 в 13:06

Просто создайте строку, которая содержит все рассматриваемые данные, и затем используйте String.replaceAll () как ниже.

String result = yourString.replaceAll("&", "&amp;");
4
ответ дан 31 October 2019 в 13:06

Выход из строк может быть хитер - особенно, если Вы хотите принять unicode во внимание. Я предполагаю, что XML является одним из более простых форматов/языков для выхода, но все еще. Я рекомендовал бы смотреть на класс StringEscapeUtils в Apache палата общин Lang и его удобное метод escapeXml .

1
ответ дан 31 October 2019 в 13:06

При использовании Spring, можно просто звонить HtmlUtils.htmlEscape(String input), который обработает '&'; к '&'; перевод.

0
ответ дан 31 October 2019 в 13:06
//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);
            }
        }
    }
0
ответ дан 31 October 2019 в 13:06

Другие вопросы по тегам:

Похожие вопросы: