Як видалити повторювані пробіли білого кольору (включаючи вкладки, нові рядки, пробіли тощо) у рядку за допомогою 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, " ", " ");
це працює досить швидко на андроїд, навпроти регулярного виразка
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+"," ");
Це можливо в три етапи: