Как удалить дубликаты пробелов (включая табуляции, новые строки, пробелы и т. Д.) В строке с помощью Java?
Как удалить дубликаты пробелов (включая табуляции, новые строки, пробелы и т. Д.) В строке с помощью Java?
Ответы:
Как это:
yourString = yourString.replaceAll("\\s+", " ");
Например
System.out.println("lorem ipsum dolor \n sit.".replaceAll("\\s+", " "));
выходы
lorem ipsum dolor sit.
Что это \s+
значит?
\s+
это регулярное выражение. \s
соответствует пробелу, табуляции, новой строке, возврату каретки, подаче формы или вертикальной табуляции и +
говорит «один или несколько из них». Таким образом, приведенный выше код свернет все «подстроки пробелов» длиннее, чем один символ, с одним пробелом.
\s+
но что означает 2 \ \?
"\\"
представляет строку, состоящую из одного обратного слеша. Так что представлять \s+
вы пишите "\\s+"
.
Вы можете использовать регулярное выражение
(\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}"," ");
Попробуйте это - вы должны import java.util.regex.*;
Pattern pattern = Pattern.compile("\\s+");
Matcher matcher = pattern.matcher(string);
boolean check = matcher.find();
String str = matcher.replaceAll(" ");
Где string
ваша строка, на которой вам нужно удалить дубликаты пробелов
привет самый быстрый (но не самый красивый способ) я нашел
while (cleantext.indexOf(" ") != -1)
cleantext = StringUtils.replace(cleantext, " ", " ");
это работает довольно быстро на Android в противоположность регулярному выражению
String str = " Text with multiple spaces ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"
Хотя уже слишком поздно, я нашел лучшее решение (которое работает для меня), которое заменит все последовательные пробелы одного типа одним пробелом своего типа. То есть:
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
Я не нашел своего решения выше, поэтому разместил его.
Если вы хотите избавиться от всех начальных и конечных лишних пробелов, то вы хотите сделать что-то вроде этого:
// \\A = Start of input boundary
// \\z = End of input boundary
string = string.replaceAll("\\A\\s+(.*?)\\s+\\z", "$1");
Затем вы можете удалить дубликаты, используя другие стратегии, перечисленные здесь:
string = string.replaceAll("\\s+"," ");
Это может быть возможно в три этапа: