Как удалить дубликаты пробелов в строке с помощью Java?

147

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

безмозглый
источник

Ответы:

378

Как это:

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

Например

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

выходы

lorem ipsum dolor sit.

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

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


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

aioobe
источник
3
@SuhrobSamiev - String.replaceAll () был в Java с JDK 1.4. docs.oracle.com/javase/1.4.2/docs/api/java/lang/… , java.lang.String)
Дэвид Моулз
3
Я хотел бы добавить больше +1 для удивительного объяснения \ s +.
Cyntech
Я понял, \s+но что означает 2 \ \?
saplingPro
2
Строковый литерал "\\"представляет строку, состоящую из одного обратного слеша. Так что представлять \s+вы пишите "\\s+".
aioobe
1
Будет ли это удалить возврат каретки? или мне придется удалить "\\ r" отдельно? Спасибо!
user3388884
24

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

(\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}"," ");
codaddict
источник
9

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

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

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

Сачин Шанбхаг
источник
9

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

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

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

wutzebaer
источник
1
Работает только для пробелов, но не для других пробелов, таких как символы табуляции и перевода строки.
Пан
1
я знаю, вы должны добавить больше циклов while для других объектов. Но этот код работает намного быстрее на Android, так как эти регулярные выражения, мне пришлось обрабатывать полные книги.
wutzebaer
Слишком быстро на рабочем столе тоже. Не проверял его на большую строку, но если вы планируете использовать его на большом количестве маленьких строк, это ответ, который вы ищете.
Ivelate
9
String str = "   Text    with    multiple    spaces    ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"
oleg.cherednik
источник
6

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

   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предназначен для замены совпадающих строк на строку группы # 1 (которая содержит только 1 символ пробела) соответствующего типа (то есть единственный символ пробела, который соответствует). Приведенное выше решение изменится так:

   Hello!\n\n\nMy    World  

будет

Hello!\nMy World

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

arnobpl
источник
0

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

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

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

string = string.replaceAll("\\s+"," ");
jonnysamps
источник
0

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

String s = "Your Text Here";        
StringTokenizer st = new StringTokenizer( s, " " );
while(st.hasMoreTokens())
{
    System.out.print(st.nextToken());
}
ИМВП
источник
-10

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

  1. Преобразовать строку в массив символов (ToCharArray)
  2. Подать заявку на цикл в массиве Charater
  3. Затем примените функцию замены строки (Replace («строка, которую вы хотите заменить», «исходная строка»));
Dheeraj в Techreuters
источник
1
Это не очень хорошее решение, переход на массив символов ничего не решает. Вы на самом деле не объясняете, как сделать замену, которая является ядром проблемы. Также, пожалуйста , не размещайте совершенно не связанные ссылки. Вы будете помечены как спамер, если вы это сделаете.
Мат