Подтвердить что ты не робот

Очистка и замена текста: удалить \n из текста в Java

Я очищаю входящий текст в своем Java-коде. Текст содержит много "\n" , но не как в новой строке, а буквально "\n" . Я использовал replaceAll() из класса String, но не смог удалить "\n" . Это не работает:

String string;
string = string.replaceAll("\\n", "");

Также это:

String string;
string = string.replaceAll("\n", "");

Я предполагаю, что этот последний идентифицируется как настоящая новая строка, поэтому все новые строки из текста будут удалены.

Кроме того, что было бы эффективным способом удаления различных шаблонов неправильного текста из String. Я использую регулярные выражения для их обнаружения, такие как HTML зарезервированные символы и т.д. И replaceAll, но каждый раз, когда я использую replaceAll, вся строка считывается, правильно?

ОБНОВЛЕНИЕ: Спасибо за ваши замечательные ответы. Я задал этот вопрос здесь:
Эффективность замены текста
Я спрашиваю конкретно об эффективности: D

4b9b3361

Ответ 1

Hooknc прав. Я просто хотел бы написать небольшое объяснение:

"\\n" преобразуется в "\n" после завершения компилятора (поскольку вы избегаете обратную косую черту). Поэтому движок регулярных выражений видит "\n" и думает о новой строке и удаляет те (а не буквальные "\n", которые у вас есть).

"\n" преобразуется в новую новую строку компилятором. Таким образом, новый символ линии отправляется в механизм регулярных выражений.

"\\\\n" является уродливым, но правильным. Компилятор удаляет escape-последовательности, поэтому механизм regex видит "\\n". Механизм регулярных выражений видит две обратные косые черты и знает, что первый избегает его, что переводит на проверку буквенных символов "\" и "n", что дает желаемый результат.

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

Ответ 2

Думаю, вам нужно добавить еще пару слэш...

String string;
string = string.replaceAll("\\\\n", "");

Объяснение: Количество slashies связано с тем, что "\n" сам по себе является управляемым символом в Java.

Итак, чтобы получить реальные символы "\n" , мы должны использовать "\n" . Что если распечатать с нами: "\"

Вы хотите заменить все "\n" в вашем файле. Но вы не хотите заменять элемент управления "\n" . Итак, вы попробовали "\n" , который будет преобразован в символы "\n" . Отлично, но, может быть, и не так много. Я предполагаю, что метод replaceAll на самом деле будет создавать регулярное выражение с использованием символов "\n" , которые будут неправильно интерпретированы как управляющий символ "\n" .

Ух, почти сделано.

Использование replaceAll ( "\\n", "") сначала преобразует "\\n" → "\n" , которое будет использоваться регулярным выражением. "\n" будет использоваться в регулярном выражении и фактически представляет ваш текст "\n" . Это то, что вы хотите заменить.

Ответ 3

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

String replacement = string.replace("\\n", "");

должен делать то, что вы хотите.

Ответ 4

string = string.replaceAll(""+(char)10, " ");

Ответ 5

Попробуйте это. Надеюсь, поможет.

raw = raw.replaceAll("\t", "");
raw = raw.replaceAll("\n", "");
raw = raw.replaceAll("\r", "");

Ответ 6

В других ответах достаточно подробно описано, как это сделать с помощью replaceAll, и как вам нужно, если необходимо, избегать обратных косых черт.

Начиная с версии 1.5, существует также String.replace(CharSequence, CharSequence), который выполняет литеральную замену строки. Это может значительно упростить многие проблемы замены строк, потому что нет необходимости избегать каких-либо метасимволов регулярного выражения, таких как ., *, | и да, \.

Таким образом, с учетом строки, которая может содержать подстроку "\n" (not '\n'), мы можем удалить их следующим образом:

String before = "Hi!\\n How are you?\\n I'm \n   good!";
System.out.println(before);
// Hi!\n How are you?\n I'm 
//   good!

String after = before.replace("\\n", "");

System.out.println(after);
// Hi! How are you? I'm 
//   good!

Обратите внимание, что если вы настаиваете на использовании replaceAll, вы можете предотвратить уродство, используя Pattern.quote:

System.out.println(
    before.replaceAll(Pattern.quote("\\n"), "")
);
// Hi! How are you? I'm 
//   good!

Вы также должны использовать Pattern.quote, когда вам предоставляется произвольная строка, которая должна быть сопоставлена ​​буквально, а не как шаблон регулярного выражения.

Ответ 7

Я использовал это решение для решения этой проблемы:

String replacement = str.replaceAll("[\n\r]", "");

Ответ 8

Обычно\n работает нормально. В противном случае вы можете выбрать несколько операторов replaceAll. сначала примените один текст replaceAll в тексте, а затем снова примените replaceAll к тексту. Должен делать то, что вы ищете.

Ответ 9

Я считаю, что replaceAll() - дорогостоящая операция. Решение ниже будет работать лучше:

String temp = "Hi \n Wssup??";          
System.out.println(temp);

StringBuilder result = new StringBuilder();

StringTokenizer t = new StringTokenizer(temp, "\n");

while (t.hasMoreTokens()) {
    result.append(t.nextToken().trim()).append("");
}
String result_of_temp = result.toString();

System.out.println(result_of_temp);