2010-10-18 17 views

ответ

354

Как это:

yourString = yourString.replaceAll("\\s+", " "); 

Например

System.out.println("lorem ipsum dolor \n sit.".replaceAll("\\s+", " ")); 

выходы

lorem ipsum dolor sit. 

Что это \s+ значит?

\s+ - это регулярное выражение. \s соответствует пробелу, вкладке, новой строке, возврату каретки, подаче формы или вертикальной вкладке, а + говорит «один или несколько из них». Таким образом, приведенный выше код скроет все «пробельные подстроки» длиннее одного символа с одним символом пробела.


Источник: Java: Removing duplicate white spaces in strings

+0

почему нет методы replaceAll ?? Поддерживает ли последний JDK этот метод? –

+2

@SuhrobSamiev - String.replaceAll() был на Java с JDK 1.4. http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#replaceAll(java.lang.String, java.lang.String) –

+3

Хотел бы я добавить больше, чем +1 для удивительного объяснения \ s +. – Cyntech

9

Попробуйте это - Вы должны import java.util.regex.*;

Pattern pattern = Pattern.compile("\\s+"); 
    Matcher matcher = pattern.matcher(string); 
    boolean check = matcher.find(); 
    String str = matcher.replaceAll(" "); 

Где string является вашу строку, на которую вам нужно удалить дубликаты пробелы

23

Вы можете использовать регулярное выражение

(\s)\1 

и

заменить его $1.

код Java:

str = str.replaceAll("(\\s)\\1","$1"); 

Если вход "foo\t\tbar " вы получите "foo\tbar " в качестве выходного
Но если вход "foo\t bar" останется неизменным, потому что он не имеет каких-либо последовательных пробельных символов.

Если рассматривать все пробельные символы (пробел, вертикальная табуляция, горизонтальная табуляция, возврат каретки, форма подачи, новая линия), как пространство, то вы можете использовать следующее регулярное выражение для замены любое количество последовательных белого пространства с единое пространство:

str = str.replaceAll("\\s+"," "); 

Но если вы хотите, чтобы заменить два последовательных белого пространства с одним пробелом вы должны сделать:

str = str.replaceAll("\\s{2}"," "); 
-10

Это может быть возможно в три этапа:

  1. Преобразовать строку, чтобы массив символов (ToCharArray)
  2. Применить цикл на массиве charater
  3. Затем примените строку функции замены (Replace ("ужалить вы хотите заменить", "исходную строку"));
+1

Это нехорошее решение, при отбрасывании массива char ничего не решает. Вы на самом деле не объясняете, как сделать замену, которая является ядром проблемы. Кроме того, пожалуйста ** ** не ** отправлять полностью несвязанные ссылки. Если вы это сделаете, вас пометят как спамера. – Mat

0

Если вы хотите, чтобы избавиться от всех передней и задней постороннему пробельных то вы хотите сделать что-то вроде этого:

// \\A = Start of input boundary 
// \\z = End of input boundary 
string = string.replaceAll("\\A\\s+(.*?)\\s+\\z", "$1"); 

Затем вы можете удалить дубликаты, используя другие стратегии, перечисленные здесь:

string = string.replaceAll("\\s+"," "); 
9

привет быстрый (но не симпатичный способ) я нашел это

while (cleantext.indexOf(" ") != -1) 
    cleantext = StringUtils.replace(cleantext, " ", " "); 

Это работает довольно быстро на андроиде в обратном направлении к регулярному выражению

+1

Работает только для пробелов, но не для других пробелов, таких как вкладки и символы новой строки. – Pang

+1

Я знаю, вы должны добавить больше этих циклов для других объектов. Но этот код работает намного быстрее на android в качестве этого регулярного выражения, мне пришлось обрабатывать полные электронные книги. – wutzebaer

+0

Необычно быстрее на рабочем столе. Не тестировали его на большую строку, но если вы планируете запустить ее на большом количестве небольших строк, это ответ, который вы ищете. – Ivelate

5

Хотя уже слишком поздно, я нашел лучшее решение (которое работает для меня), которое заменит все последующие белые пробелы одного типа с одним пробелом его тип. То есть:

Hello!\n\n\nMy World 

будет

Hello!\nMy World 

Уведомление Есть еще начальные и конечные пробелы. Так что мое полное решение:

str = str.trim().replaceAll("(\\s)+", "$1")); 

Здесь trim() заменяет все начальные и конечные пробельные строки с «». (\\s) предназначен для захвата \\s (то есть белых пространств, таких как '', '\ n', '\ t') в группе # 1. Знак + предназначен для сопоставления 1 или более предшествующих токенов. Таким образом, (\\s)+ могут быть последовательными символами (1 или более) среди любых одиночных символов пробела ('', '\ n' или '\ t'). $1 предназначен для замены соответствующих строк на строку group # 1 (которая содержит только 1 символ пробела) соответствующего типа (то есть совпадающего символа одиночного пробела). Выше решение будет меняться следующим образом:

Hello!\n\n\nMy World 

будет

Hello!\nMy World 

Я не нашел мое выше решение здесь, поэтому я разместил его.

0

Вы также можете попробовать использовать Sten Tokeniser для любого пространства, табуляции, новой строки и т. Д. Простой способ,

String s = "Your Text Here";   
StringTokenizer st = new StringTokenizer(s, " "); 
while(st.hasMoreTokens()) 
{ 
    System.out.print(st.nextToken()); 
} 
8
String str = " Text with multiple spaces "; 
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str); 
// str = "Text with multiple spaces" 
Смежные вопросы