Как заменить символ в строке в Java? - PullRequest
61 голосов
/ 05 августа 2009

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

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

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

       }
}

Ответы [ 9 ]

112 голосов
/ 05 августа 2009

Попробуйте использовать String.replace() или String.replaceAll().

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

(оба заменяют все вхождения; replaceAll позволяет использовать регулярные выражения.)

88 голосов
/ 05 августа 2009

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

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

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

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

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

Apache также имеет экранирующую библиотеку в составе Commons Lang.

14 голосов
/ 05 августа 2009
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();
8 голосов
/ 05 августа 2009

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

Например:

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

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

Шаблон регулярного выражения "& (?! amp;)" в основном гласит: сопоставьте любое вхождение '&', за которым не следует 'amp;'.

4 голосов
/ 05 августа 2009

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

String result = yourString.replaceAll("&", "&amp;");
1 голос
/ 20 августа 2017

Попробуйте этот код. Вы можете заменить любой символ другим данным символом. Здесь я попытался заменить букву 'a' на "-" символ для заданной строки "abcdeaa"

OutPut -> _ bcdef __

    public class Replace {

    public static void replaceChar(String str,String target){
        String result = str.replaceAll(target, "_");
        System.out.println(result);
    }

    public static void main(String[] args) {
        replaceChar("abcdefaa","a");
    }

}
1 голос
/ 05 августа 2009

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

0 голосов
/ 08 сентября 2016
//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 голосов
/ 05 августа 2009

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

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