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

Бит awk должен сделать это?

awk '{s+=$1} END {print s}' mydatafile

Примечание: некоторые версии awk имеют некоторые нечетные поведения, если Вы собираетесь быть добавлением чего-нибудь превышение 2^31 (2147483647). См. комментарии для большего количества фона. Одно предложение должно использовать printf, а не print:

awk '{s+=$1} END {printf "%.0f", s}' mydatafile
64
задан Rob Hruska 5 August 2009 в 17:08
поделиться

7 ответов

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

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

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

117
ответ дан 24 November 2019 в 15:36
поделиться

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

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

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

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

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

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

89
ответ дан 24 November 2019 в 15:36
поделиться
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
ответ дан 24 November 2019 в 15:36
поделиться

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

Например:

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

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

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

8
ответ дан 24 November 2019 в 15:36
поделиться

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

1
ответ дан 24 November 2019 в 15:36
поделиться

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

String result = yourString.replaceAll("&", "&amp;");
4
ответ дан 24 November 2019 в 15:36
поделиться

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

0
ответ дан 24 November 2019 в 15:36
поделиться
Другие вопросы по тегам:

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