Удаление пробелов из строк в Java


684

У меня есть такая строка:

mysz = "name=john age=13 year=2001";

Я хочу удалить пробелы в строке. Я пытался, trim()но это удаляет только пробелы до и после всей строки. Я также пытался, replaceAll("\\W", "")но затем =также удаляется.

Как я могу получить строку с:

mysz2 = "name=johnage=13year=2001"

1
\\Wозначает, что все не слова см. download.oracle.com/javase/6/docs/api/java/util/regex/…
Nishant

76
Какой у вас план со строкой "name = johnage = 13year = 2001"? Надо не разбирать это.
Йонас Эльфстрём,

4
@ JonasElfström Я думаю, что это поможет со сравнением строк
Исаак

как насчет, если строка на самом деле = "". Все, что делает trims () - очищает пустую строку, как я уже говорил? @zyamat?
Gumuruh

Ответы:


1289

st.replaceAll("\\s+","")удаляет все пробелы и невидимые символы (например, табуляция \n).


st.replaceAll("\\s+","")и st.replaceAll("\\s","")дать тот же результат.

Второе регулярное выражение на 20% быстрее первого, но по мере увеличения числа последовательных пробелов первое работает лучше, чем второе.


Присвойте значение переменной, если она не используется напрямую:

st = st.replaceAll("\\s+","")

34
Я хотел бы отметить, что эти два регулярных выражения будут давать разные результаты, если вы хотите заменить все пробелы одним пробелом (или другим набором символов). Если у вас есть последовательные пробелы, с помощью \\ s он заменит каждый символ пробела указанными символами. Учитывая \\ s +, он заменит каждый набор пробелов одной строкой замены. Я вижу довольно много случаев, когда люди могут приходить на этот пост для замены пробела чем-то, что не является пустой строкой, и это может быть полезно.
Кейтлин,

2
но он не удаляет пробел, если он находится в начале строки.
одинокий

@lonesome использовать .trim () для этого
CQM

6
Просто используйте StringUtils из Apache-Commons. Это статический метод с именем StringUtils.deleteWhitespace.
Крозета

@Gursel спасибо за ответ и сравнение производительности для двух регулярных выражений. Мне было интересно, почему есть разница в производительности между двумя? Есть ли что-то, чего мне не хватает, не могли бы вы указать мне какие-либо ссылки, которые больше говорят о разнице в производительности.
Вишрант

248
replaceAll("\\s","")

\w = Все, что является символом слова

\W = Все, что не является символом слова (включая знаки препинания и т. Д.)

\s = Все, что является пробелом (включая пробел, символы табуляции и т. Д.)

\S = Все, что не является пробелом (включая буквы и цифры, а также знаки препинания и т. Д.)

(Редактировать: как указано, вам нужно избежать обратной косой черты, если вы хотите \sполучить движок регулярных выражений, в результате \\s.)


103

Самый правильный ответ на вопрос:

String mysz2 = mysz.replaceAll("\\s","");

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

(Опытные Java-разработчики могут сказать: «Конечно, вы не можете изменить строку», но целевая аудитория по этому вопросу может и не знать об этом.)


Означает ли это, что мы можем перезаписать исходную строку, написав, например: S = S.replaceAll ("\\ s", ""); в то время как сначала будет произведена замена, а затем S получит версию S
frogeyedpeas, заполненную символами,

@frogeyedpeas Переписывает переменную, Sно не перезаписывает строку, на которую Sуказывает.
Восстановить Монику

Спас мой день! ;)
Paras Jain


45

Одним из способов обработки строковых манипуляций является StringUtils из общего достояния Apache.

String withoutWhitespace = StringUtils.deleteWhitespace(whitespaces);

Вы можете найти это здесь . commons-lang включает в себя намного больше и хорошо поддерживается.


Это имеет преимущество в том, чтобы быть более читабельным.
Пейн

37

Если вам также нужно удалить неразрывные пробелы, вы можете обновить код следующим образом:

st.replaceAll("[\\s|\\u00A0]+", "");

Это не для: " ab c "
Мохд Фарид

1
@MohdFarid Применил исправление, теперь все должно быть в порядке.
Денис Кулагин

Я думаю, что это должно быть st.replaceAll ("[\\ s | \ u00A0] +", "");
Paramupk

30

Если вы предпочитаете вспомогательные классы регулярным выражениям, есть метод trimAllWhitespace (String) в StringUtils в Spring Framework.


13
Альтернативные идеи приветствуются. Они помогут некоторым людям, даже если не всем.
james.garriss

25

Вы уже получили правильный ответ от Gursel Koca, но я считаю, что есть хороший шанс, что это не то, что вы действительно хотите сделать. Как насчет парсинга значений ключа?

import java.util.Enumeration;
import java.util.Hashtable;

class SplitIt {
  public static void main(String args[])  {

    String person = "name=john age=13 year=2001";

    for (String p : person.split("\\s")) {
      String[] keyValue = p.split("=");
      System.out.println(keyValue[0] + " = " + keyValue[1]);
    }
  }
}

вывод:
имя = Джон
возраст = 13
год = 2001


22

Вы должны использовать

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

вместо:

s.replaceAll("\\s", "");

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


2
Я набрал быстрый пример, чтобы проверить это, потому что он показался мне странным, и обнаружил, что добавленный знак плюс не нужен. Несколько пробелов, разделяющих слова потребляются. Причина этого, скорее всего, replaceAllповторяется до тех пор, пока шаблон не совпадет ни с одной частью строки.
Nyaray

2
Верно. Это +может сделать его немного более дружественным к процессору, потому что последовательный пробел обрабатывается в одной операции замены, но это единственное отличие в этом случае. Это действительно All, а не то, +что заменяет непоследовательный пробел в строке.
nitro2k01

это не удаляет это (u00A0)
Kerim FIRAT

8

Самый простой способ сделать это - использовать org.apache.commons.lang3.StringUtilsкласс commons-lang3библиотеки, например, " commons-lang3-3.1.jar".

Используйте статический метод " StringUtils.deleteWhitespace(String str)" в вашей входной строке, и он вернет вам строку после удаления всех пробелов из нее. Я попробовал ваш пример строки " name=john age=13 year=2001", и он вернул мне именно ту строку, которую вы хотели - " name=johnage=13year=2001". Надеюсь это поможет.


7

Вы можете сделать это так просто,

String newMysz = mysz.replace(" ","");

Удивительно, единственный работник в моей ситуации. Спасибо.
Валерий

6
public static void main(String[] args) {        
    String s = "name=john age=13 year=2001";
    String t = s.replaceAll(" ", "");
    System.out.println("s: " + s + ", t: " + t);
}

Output:
s: name=john age=13 year=2001, t: name=johnage=13year=2001

4
String a="string with                multi spaces ";
//or this 
String b= a.replaceAll("\\s+"," ");
String c= a.replace("    "," ").replace("   "," ").replace("  "," ").replace("   "," ").replace("  "," ");

// он отлично работает с любыми пробелами * не забывайте пробел в sting b


Очень полезно, но не отвечает на опубликованный вопрос!
BuvinJ

3

\Wозначает «не слово символ». Шаблон для пробельных символов есть \s. Это хорошо задокументировано в шаблоне Javadoc .


8
Где остальная часть этого ответа?
LS

3

В Java мы можем сделать следующую операцию:

String pattern="[\\s]";
String replace="";
part="name=john age=13 year=2001";
Pattern p=Pattern.compile(pattern);
Matcher m=p.matcher(part);
part=m.replaceAll(replace);
System.out.println(part);

Для этого вам необходимо импортировать следующие пакеты в вашу программу:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

Я надеюсь, что это поможет вам.


Эта информация была предоставлена ​​другими годами до того, как вы опубликовали свой ответ.
Ян Грот

3

Использование Pattern And Matcher более динамично.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RemovingSpace {

    /**
     * @param args
     * Removing Space Using Matcher
     */
    public static void main(String[] args) {
        String str= "jld fdkjg jfdg ";
        String pattern="[\\s]";
        String replace="";

        Pattern p= Pattern.compile(pattern);
        Matcher m=p.matcher(str);

        str=m.replaceAll(replace);
        System.out.println(str);    
    }
}


3

Используйте apache string util class, чтобы избежать NullPointerException

org.apache.commons.lang3.StringUtils.replace("abc def ", " ", "")

Вывод

abcdef


2
mysz = mysz.replace(" ","");

Первый с пробелом, второй без пробела.

Тогда это сделано.


7
Просто чтобы уточнить, пробел означает [ \t\n\x0B\f\r]. Вы делаете только нормальные [ ]пробелы.
GKFX

2
import java.util.*;
public class RemoveSpace {
    public static void main(String[] args) {
        String mysz = "name=john age=13 year=2001";
        Scanner scan = new Scanner(mysz);

        String result = "";
        while(scan.hasNext()) {
            result += scan.next();
        }
        System.out.println(result);
    }
}


1

Чтобы удалить пробелы в вашем примере, это еще один способ сделать это:

String mysz = "name=john age=13 year=2001";
String[] test = mysz.split(" ");
mysz = String.join("", mysz);

Что он делает, так это конвертирует его в массив с пробелами, являющимися разделителями, а затем объединяет элементы в массиве без пробелов.

Это работает довольно хорошо и легко понять.


2
Но очень неэффективное решение. И, как вы можете видеть из других решений - это работает только для "" пространства - а не для разных видов пробелов.
GhostCat

1

Есть и другие символьные пространства, которые тоже существуют в строках. Таким образом, нам может понадобиться заменить символ пространства из строк.

Пример: пространство без перерыва, пространство три-EM, пространство пунктуации

Вот список космических символов http://jkorpela.fi/chars/spaces.html

Итак, нам нужно изменить

\ нас2004 для пространства три-на-EM

s.replaceAll ( "[\ u0020 \ u2004]", "")


0

Пробел можно удалить с помощью функции isWhitespace из класса символов.

public static void main(String[] args) {
    String withSpace = "Remove white space from line";
    StringBuilder removeSpace = new StringBuilder();

    for (int i = 0; i<withSpace.length();i++){
        if(!Character.isWhitespace(withSpace.charAt(i))){
            removeSpace=removeSpace.append(withSpace.charAt(i));
        }
    }
    System.out.println(removeSpace);
}

0

Разделите каждую группу текста на собственную подстроку и затем объедините эти подстроки:

public Address(String street, String city, String state, String zip ) {
    this.street = street;
    this.city = city;
    // Now checking to make sure that state has no spaces...
    int position = state.indexOf(" ");
    if(position >=0) {
        //now putting state back together if it has spaces...
        state = state.substring(0, position) + state.substring(position + 1);  
    }
}

0
public static String removeWhiteSpaces(String str){
    String s = "";
    char[] arr = str.toCharArray();
    for (int i = 0; i < arr.length; i++) {
        int temp = arr[i];
        if(temp != 32 && temp != 9) { // 32 ASCII for space and 9 is for Tab
            s += arr[i];
        }
    }
    return s;
}

Это может помочь.


0

Вы также можете взглянуть на приведенный ниже код Java. Следующие коды не используют никаких «встроенных» методов.

/**
 * Remove all characters from an alphanumeric string.
 */
public class RemoveCharFromAlphanumerics {

    public static void main(String[] args) {

        String inp = "01239Debashish123Pattn456aik";

        char[] out = inp.toCharArray();

        int totint=0;

        for (int i = 0; i < out.length; i++) {
            System.out.println(out[i] + " : " + (int) out[i]);
            if ((int) out[i] >= 65 && (int) out[i] <= 122) {
                out[i] = ' ';
            }
            else {
                totint+=1;
            }

        }

        System.out.println(String.valueOf(out));
        System.out.println(String.valueOf("Length: "+ out.length));

        for (int c=0; c<out.length; c++){

            System.out.println(out[c] + " : " + (int) out[c]);

            if ( (int) out[c] == 32) {
                System.out.println("Its Blank");
                 out[c] = '\'';
            }

        }

        System.out.println(String.valueOf(out));

        System.out.println("**********");
        System.out.println("**********");
        char[] whitespace = new char[totint];
        int t=0;
        for (int d=0; d< out.length; d++) {

            int fst =32;



            if ((int) out[d] >= 48 && (int) out[d] <=57 ) {

                System.out.println(out[d]);
                whitespace[t]= out[d];
                t+=1;

            }

        }

        System.out.println("**********");
        System.out.println("**********");

        System.out.println("The String is: " + String.valueOf(whitespace));

    }
}

Входные данные:

String inp = "01239Debashish123Pattn456aik";

Вывод:

The String is: 01239123456

0
private String generateAttachName(String fileName, String searchOn, String char1) {
    return fileName.replaceAll(searchOn, char1);
}


String fileName= generateAttachName("Hello My Mom","\\s","");

0

Довольно много ответов предоставлено. Я хотел бы дать решение, которое вполне читабельно и лучше, чем регулярное выражение.

import java.io.IOException;

import org.apache.commons.lang.StringUtils;

public class RemoveAllWhitespaceTest {

    public static void main(String[] args) throws IOException {

        String str1 = "\n\tThis is my string \n \r\n  !";

        System.out.println("[" + str1 + "]");

        System.out.println("Whitespace Removed:");

        System.out.println("[" + StringUtils.deleteWhitespace(str1) + "]");

        System.out.println();

    }

}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.