Как удалить дубликаты пробелов в строке с помощью Java? - PullRequest
145 голосов
/ 18 октября 2010

Как удалить дубликаты пробелов (включая табуляции, новые строки, пробелы и т. Д.) В строке с помощью Java?

Ответы [ 9 ]

373 голосов
/ 18 октября 2010

Например:

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

Например,

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

выходы

lorem ipsum dolor sit.

Что означает \s+?

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


Источник: Java: удаление дублирующих пробелов в строках

24 голосов
/ 18 октября 2010

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

(\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}"," ");
9 голосов
/ 21 июля 2013

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

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

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

9 голосов
/ 18 октября 2010

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

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

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

8 голосов
/ 23 декабря 2016
String str = "   Text    with    multiple    spaces    ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"
6 голосов
/ 13 февраля 2015

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

   Hello!\n\n\nMy    World  

будет

 Hello!\nMy World 

Обратите внимание, что по-прежнему есть пробелы в начале и в конце. Итак, мое полное решение:

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

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

   Hello!\n\n\nMy    World  

будет

Hello!\nMy World

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

0 голосов
/ 15 сентября 2015

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

String s = "Your Text Here";        
StringTokenizer st = new StringTokenizer( s, " " );
while(st.hasMoreTokens())
{
    System.out.print(st.nextToken());
}
0 голосов
/ 28 мая 2013

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

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

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

string = string.replaceAll("\\s+"," ");
0 голосов
/ 21 августа 2011

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

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