Очистка и замена текста: удалить \ n из текста в Java - PullRequest
25 голосов
/ 12 февраля 2009

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

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

Не делает этого:

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

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

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

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

Ответы [ 9 ]

43 голосов
/ 12 февраля 2009

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

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

"\ n" переводится компилятором в настоящую новую строку. Поэтому символ новой строки отправляется в механизм регулярных выражений.

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

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

22 голосов
/ 12 февраля 2009

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

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

Пояснение: Количество слешей связано с тем фактом, что «\ n» сам по себе является контролируемым символом в Java.

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

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

Вот так, почти готово.

Использование replaceAll ("\\ n", "") сначала преобразует "\\ n" -> "\ n", который будет использоваться регулярным выражением. «\ N» будет затем использоваться в регулярном выражении и фактически представляет ваш текст «\ n». Который вы хотите заменить.

11 голосов
/ 12 февраля 2009

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

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

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

3 голосов
/ 20 сентября 2012
string = string.replaceAll(""+(char)10, " ");
2 голосов
/ 29 сентября 2010

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

raw = raw.replaceAll("\t", "");
raw = raw.replaceAll("\n", "");
raw = raw.replaceAll("\r", "");
1 голос
/ 07 августа 2012

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

String replacement = str.replaceAll("[\n\r]", "");
1 голос
/ 16 августа 2010

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

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

Таким образом, учитывая строку, которая может содержать подстроку "\n" (не '\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, когда вы получаете произвольную строку, которая должна совпадать буквально, а не как шаблон регулярного выражения.

0 голосов
/ 22 июня 2011

Я считаю, 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);
0 голосов
/ 12 февраля 2011

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

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