Очистка и замена текста: удалить \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
Ответы
Ответ 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);