Видалення пробілів із рядків на 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

75
Який у вас план із рядком "name = johnage = 13year = 2001"? Я не сподіваюся на це розібратися.
Jonas Elfström

4
@ JonasElfström Я думаю, що це допоможе у порівнянні струн
Ісаак

як щодо того, якщо рядок насправді = "". Чи все, що робить тримс () - це очищення порожньої рядка, як я вже згадував? @zyamat?
гумуру

Можливий дублікат того, як видалити пробіл у рядку java
KIBOU Hassan

Відповіді:


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.
Crozeta

@Gursel дякую за відповідь та порівняння продуктивності за два регулярні вирази. Мені було цікаво, чому між двома є різниця в продуктивності? Що-небудь мені не вистачає, ви можете, будь-ласка, вказати мені будь-яку посилання, що більше говорить про наявність різниці в продуктивності
Вишрант

247
replaceAll("\\s","")

\w = Все, що є символом слова

\W = Все, що не є символом слова (включаючи розділові знаки тощо)

\s = Все, що є пробілом (включаючи пробіл, символи вкладки тощо)

\S = Все, що не є пробілом (включаючи букви та цифри, а також розділові знаки тощо)

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


103

Найправильніша відповідь на питання:

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

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

(Досвідчені розробники Java можуть сказати, "звичайно, ви не можете насправді змінити String", але цільова аудиторія для цього питання цілком може цього не знати.)


Чи означає це, що ми можемо перезаписати початковий рядок, написавши наприклад: S = S.replaceAll ("\\ s", ""); тоді як спочатку буде здійснено заміну, а потім S отримає
символічну

@frogeyedpeas Це перезапис змінної, Sале вона не замінює рядок, на який Sвказує.
Відновіть Моніку

Врятував мій день! ;)
Paras Jain


45

Одним із способів поводження з String маніпуляціями є StringUtils від Apache commons.

String withoutWhitespace = StringUtils.deleteWhitespace(whitespaces);

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


Це має перевагу в тому, що вона є більш читаною.
payne

36

Якщо вам також потрібно видалити нерозбірні пробіли, ви можете оновити код таким чином:

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

Це не вдається: " ab c "
Mohd Farid

1
@MohdFarid Якщо застосовано виправлення, зараз має бути добре.
Денис Кулагін

Я думаю, що це має бути st.replaceAll ("[\\ s | \ u00A0] +", "");
paramupk

30

Якщо ви віддаєте перевагу класам утиліти перед регулярними виразами, у StringUtils у Spring Framework існує метод trimAllWhitespace (String) .


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]);
    }
  }
}

вихід:
name = john
вік = 13
рік = 2001


22

Ви повинні використовувати

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

замість:

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

Таким чином, він буде працювати з більш ніж одним пробілом між кожним рядком. Знак + у наведеному вище регексе означає "один або більше \ s"


2
Я набрав короткий приклад, щоб перевірити це, тому що мені це звучало дивно, і я виявив, що доданий знак плюс не потрібен. Виділяється кілька пробілів, що розділяють слова Причина цього, швидше за все, replaceAllповторюється, поки шаблон не збігається з жодною частиною рядка.
нярай

2
Справді. +Може зробити дружнім це трохи більше ресурсів процесора, оскільки послідовний пробільним обробляється в одній операції заміни, але це єдина відмінність в цьому випадку. Це дійсно те All, що не те, +що замінює проміжки без послідовних пробілів у рядку.
nitro2k01

це не видаляє (u00A0)
Керім 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". Сподіваюсь, це допомагає.



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("  "," ");

// це добре працює з будь-якими пробілами * не забувайте місця в жалобі 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

Використовувати клас util-ряду apache, краще уникати 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

У рядках також є інші пробіли простір .. Тож пробіл, який нам може знадобитися замінити з рядків.

Напр .: ПРОСТО НЕРАБОТИ, ТРИ-ПЕР-ЕМ ПРОСТІР, ПУНКТУАЦІЙНИЙ ПРОСТОР

Ось список космічних карт http://jkorpela.fi/chars/spaces.html

Тому нам потрібно модифікувати

\ u2004 нас для ТРИ-ПЕР-ЕМ ПРОСТОР

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.