Eliminarea spațiilor albe din șiruri de caractere în Java (Programare, Java, Spațiu Alb)

zyamat a intrebat.

Am un șir de caractere ca acesta:

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

Vreau să elimin spațiile albe din șir. Am încercat trim() dar acest lucru elimină doar spațiile albe înainte și după întregul șir. De asemenea, am încercat replaceAll("\W", "") dar atunci se obține = este de asemenea eliminat.

Cum pot obține un șir cu:

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

Comentarii

  • \W înseamnă toate non-parole a se vedea download.oracle.com/javase/6/docs/api/java/java/util/regex/… –  > Por Nishant.
  • 80

  • Care este planul tău cu șirul „name=johnage=13year=2001”? Sper că nu pentru a o analiza. –  > Por Jonas Elfström.
  • @JonasElfström Îmi imaginez că este pentru a ajuta la compararea șirurilor de caractere –  > Por Isaac.
  • ce zici dacă șirul este de fapt = ” ” . Tot ceea ce face trims() este să curețe șirul gol, așa cum am menționat? @zyamat ? –  > Por gumuruh.
  • Possible duplicate of Cum se elimină spațiul alb în șirul de caractere din java –  > Por KIBOU Hassan.
36 răspunsuri
Gursel Koca

st.replaceAll("\s+","") elimină toate spațiile albe și caracterele invizibile (de exemplu, tab,
).


st.replaceAll("\s+","") și st.replaceAll("\s","") produc același rezultat.

Cea de-a doua regex este cu 20% mai rapidă decât prima, dar pe măsură ce numărul de spații consecutive crește, prima regex este mai performantă decât cea de-a doua.


Atribuiți valoarea la o variabilă, dacă nu este utilizată direct:

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

Comentarii

    40

  • Aș dori să remarc faptul că aceste două regex-uri vor produce rezultate diferite dacă doriți să înlocuiți toate spațiile albe cu un singur spațiu (sau cu un alt set de caractere). Dacă aveți spații consecutive, folosind \s se va înlocui fiecare caracter de spațiu alb cu caracterele furnizate date. Dacă se utilizează \s+, se va înlocui fiecare set de spații albe cu un singur șir de caractere de înlocuire. Văd că există câteva cazuri în care oamenii vor apela la această postare pentru a înlocui spațiile albe cu ceva care nu este doar un șir gol, iar acest lucru ar putea fi util. –  > Por Caitlin.
  • dar nu elimină spațiile albe dacă acestea se află la începutul șirului. –  > Por lonesome.
  • @lonesome folosește .trim() pentru asta –  > Por CQM.
  • Folosiți StringUtils din apache-commons. Este o metodă statică numită StringUtils.deleteWhitespace. –  > Por Crozeta.
  • dacă doriți să utilizați această metodă într-o buclă, ar trebui să definiți Pattern ca variabilă finală Pattern.compile("\s") deoarece replaceAll recompilați pattern la fiecare apel return Pattern.compile(regex).matcher(this).replaceAll(replacement);. –  > Por Waka Waka.
nitro2k01
replaceAll("\s","")

w = Orice lucru care este un caracter de cuvânt

W = Tot ce nu este un caracter de cuvânt (inclusiv punctuația etc.)

s = Tot ce este un caracter de spațiu (inclusiv spațiu, caractere de tabulare etc.)

S = Tot ce nu este un caracter de spațiu (inclusiv litere și cifre, precum și semne de punctuație etc.)

(Editare: După cum s-a subliniat, trebuie să scăpați backslash-ul dacă doriți ca s pentru a ajunge la motorul regex, ceea ce rezultă în \s.)

Fletch

Răspunsul cel mai corect la întrebare este:

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

Tocmai am adaptat acest cod din celelalte răspunsuri. Îl postez pentru că, pe lângă faptul că este exact ceea ce a cerut întrebarea, demonstrează că rezultatul este returnat ca un nou șir de caractere, șirul original nu este modificat așa cum sugerează unele dintre răspunsuri.

(Dezvoltatorii Java experimentați ar putea spune „desigur, nu poți modifica de fapt un String”, dar publicul țintă pentru această întrebare s-ar putea să nu știe acest lucru).

Comentarii

  • Înseamnă că putem suprascrie șirul original scriind, de exemplu, String: S = S.replaceAll(„\s”, „”); în timp ce mai întâi se va face înlocuirea și apoi S va primi versiunea lui S fără caractere –  > Por frogeyedpeas.
  • @frogeyedpeas Acest lucru suprascrie variabila S dar nu suprascrie șirul de caractere care S indică. –  > Por Reinstaurați-o pe Monica.
  • Mi-a salvat ziua! 😉 –  > Por Paras Jain.
Erkan Haspulat

Ce zici de replaceAll("\s", ""). Consultați aici.

Comentarii

    57

  • Ce diferență poate face o întârziere de un minut! –  > Por HDave.
jahir

O modalitate de a gestiona manipulările String este StringUtils din Apache commons.

String withoutWhitespace = StringUtils.deleteWhitespace(whitespaces);

Îl puteți găsi aici.commons-lang include mult mai multe și este bine susținut.

v.nivuahc

Dacă aveți nevoie să eliminați și spațiile neîntreruptibile, puteți să vă actualizați codul astfel :

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

Comentarii

  • Acest lucru eșuează pentru: " ab c " –  > Por Mohd Farid.
  • @MohdFarid A aplicat o corecție, trebuie să fie în regulă acum. –  > Por Denis Kulagin.
  • Cred că ar trebui să fie st.replaceAll(„[\s|u00A0]+”, „”); –  > Por paramupk.
Varejones

Ar trebui să folosiți

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

în loc de:

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

În acest fel, va funcționa cu mai mult de un spațiu între fiecare șir de caractere. semnul + în regexul de mai sus înseamnă „unul sau mai multe s”

–s = Orice este un caracter de spațiu (inclusiv spațiu, caractere de tabulare etc.). De ce avem nevoie de s+ aici?

Comentarii

  • Am tastat un exemplu rapid pentru a verifica acest lucru, deoarece mi s-a părut ciudat și am constatat că semnul plus adăugat nu este necesar. Spațiile multiple care separă cuvintele sunt consumate. Motivul pentru acest lucru este, cel mai probabil, că replaceAll se repetă până când modelul nu se potrivește cu nicio parte a șirului. –  > Por nyaray.
  • Într-adevăr. + poate fi puțin mai ușor de utilizat pentru CPU, deoarece spațiile albe consecutive sunt tratate într-o singură operațiune de înlocuire, dar aceasta este singura diferență în acest caz. Într-adevăr, este vorba de All, și nu + care înlocuiește spațiile albe neconsecutive din șirul de caractere. –  > Por nitro2k01.
  • nu șterge acest lucru (u00A0) –  > Por Kerim FIRAT.
kamczak

Dacă preferați clasele de utilitate în locul regexurilor, există o metodă trimAllWhitespace(String) în StringUtils din cadrul Spring Framework.

Comentarii

  • Ideile alternative sunt binevenite. Ele vor ajuta pe unii oameni, chiar dacă nu pe toți. –  > Por james.garriss.
Jonas Elfström

Ați primit deja răspunsul corect de la Gursel Koca, dar cred că sunt șanse mari să nu fie asta ceea ce doriți cu adevărat să faceți. Ce-ar fi să analizați în schimb valorile cheie?

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

ieșire:
name = john
vârstă = 13
an = 2001

Ayaskant

Cel mai simplu mod de a face acest lucru este să folosiți funcția org.apache.commons.lang3.StringUtils clasa de commons-lang3 bibliotecii, cum ar fi „commons-lang3-3.1.jar„, de exemplu.

Utilizați metoda statică „StringUtils.deleteWhitespace(String str)” pe șirul de intrare & aceasta vă va returna un șir de caractere după eliminarea tuturor spațiilor albe din el. Am încercat șirul dvs. de exemplu „name=john age=13 year=2001” & mi-a returnat exact șirul pe care l-ați dorit – „name=johnage=13year=2001„. Sper că acest lucru vă ajută.

Vinod Ranga

Puteți face acest lucru atât de simplu prin

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

Comentarii

  • În mod uimitor, singurul lucrător în situația mea. Mulțumesc. –  > Por Valeriy.
avngr
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

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

//funcționează bine cu orice spațiu *nu uitați de spațiul din sting b

Comentarii

  • Foarte util, dar nu răspunde la întrebarea postată! –  > Por BuvinJ.
JB Nizet

W înseamnă „caracter fără cuvânt”. Modelul pentru caracterele de spațiu alb este s. Acest lucru este bine documentat în Javadoc Pattern.

Comentarii

  • Unde este restul răspunsului? –  > Por Domnul Lance E Sloan.
user27

În java putem face următoarea operație:

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

pentru aceasta trebuie să importați următoarele pachete în programul dvs:

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

Sper că vă va ajuta.

Comentarii

  • Aceste informații au fost furnizate de alții cu ani înainte de a posta răspunsul dvs. –  > Por jan groth.
user2357526
mysz = mysz.replace(" ","");

Prima cu spațiu, a doua fără spațiu.

Apoi se face.

Comentarii

  • Pentru a clarifica, spațiul alb înseamnă [ t
    x0Bfr]
    . Nu faci decât să faci normal [ ] spații normale. –  > Por GKFX.
jayesh

Folosind Pattern And Matcher este mai dinamic.

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

Mohammad Raza

Utilizați mysz.replaceAll("\s+","");

Comentarii

  • există un răspuns similar/echivalent cu sugestia dvs. de mai sus –  > Por omerhakanbilici.
sendon1982

Utilizați clasa apache string util este mai bună pentru a evita NullPointerException

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

Ieșire

abcdef

Jemshit Iskenderov

Când se utilizează st.replaceAll("\s+","") în Kotlin, , asigurați-vă că înfășurați "\s+" cu Regex:

"myString".replace(Regex("\s+"), "")

Tony Nguyen
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);
    }
}

Megawatt

Pentru a elimina spațiile din exemplul tău, aceasta este o altă modalitate de a face acest lucru:

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

Aceasta îl convertește într-o matrice, spațiile fiind separatorii, iar apoi combină elementele din matrice fără spații.

Funcționează destul de bine și este ușor de înțeles.

Comentarii

  • Dar este o soluție foarte ineficientă. Și, după cum puteți vedea din celelalte soluții – aceasta funcționează doar pentru spațiul ” ” ” – și nu pentru diferite tipuri de spații albe. –  > Por GhostCat.
Stian Standahl

Încerc un răspuns de agregare în care testez toate modalitățile de eliminare a tuturor spațiilor albe dintr-un șir de caractere. fiecare metodă este rulată de 1 milion de ori și apoi se face media. Notă: Unele calcule vor fi folosite la însumarea tuturor execuțiilor.


Rezultate:

Locul 1 din răspunsul lui @jahir

  • StringUtils cu text scurt: 1.21E-4 ms (121.0 ms)
  • StringUtils cu text lung: 0.001648 ms (1648.0 ms)

Locul 2

  • String builder cu text scurt: 2.48E-4 ms (248.0 ms)
  • String builder cu text lung: 0.00566 ms (5660.0 ms)

Locul 3

  • Regex cu text scurt: 8.36E-4 ms (836.0 ms)
  • Regex cu text lung: 0.008877 ms (8877.0 ms)

Locul 4

  • For loop cu text scurt: 0.001666 ms (1666.0 ms)
  • For loop cu text lung: 0.086437 ms (86437.0 ms)

Iată codul:

public class RemoveAllWhitespaces {
    public static String Regex(String text){
        return text.replaceAll("\s+", "");
    }

    public static String ForLoop(String text) {
        for (int i = text.length() - 1; i >= 0; i--) {
            if(Character.isWhitespace(text.codePointAt(i))) {
                text = text.substring(0, i) + text.substring(i + 1);
            }
        }

        return text;
    }

    public static String StringBuilder(String text){
        StringBuilder builder = new StringBuilder(text);
        for (int i = text.length() - 1; i >= 0; i--) {
            if(Character.isWhitespace(text.codePointAt(i))) {
                builder.deleteCharAt(i);
            }
        }

        return builder.toString();
    }
}

Iată testele:

import org.junit.jupiter.api.Test;

import java.util.function.Function;
import java.util.stream.IntStream;

import static org.junit.jupiter.api.Assertions.*;

public class RemoveAllWhitespacesTest {
    private static final String longText = "123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222123 123 t 1adc 
 222";
    private static final String expected = "1231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc222";

    private static final String shortText = "123 123 t 1adc 
 222";
    private static final String expectedShortText = "1231231adc222";

    private static final int numberOfIterations = 1000000;

    @Test
    public void Regex_LongText(){
        RunTest("Regex_LongText", text -> RemoveAllWhitespaces.Regex(text), longText, expected);
    }

    @Test
    public void Regex_ShortText(){
        RunTest("Regex_LongText", text -> RemoveAllWhitespaces.Regex(text), shortText, expectedShortText);

    }

    @Test
    public void For_LongText(){
        RunTest("For_LongText", text -> RemoveAllWhitespaces.ForLoop(text), longText, expected);
    }

    @Test
    public void For_ShortText(){
        RunTest("For_LongText", text -> RemoveAllWhitespaces.ForLoop(text), shortText, expectedShortText);
    }

    @Test
    public void StringBuilder_LongText(){
        RunTest("StringBuilder_LongText", text -> RemoveAllWhitespaces.StringBuilder(text), longText, expected);
    }

    @Test
    public void StringBuilder_ShortText(){
        RunTest("StringBuilder_ShortText", text -> RemoveAllWhitespaces.StringBuilder(text), shortText, expectedShortText);
    }

    private void RunTest(String testName, Function<String,String> func, String input, String expected){
        long startTime = System.currentTimeMillis();
        IntStream.range(0, numberOfIterations)
                .forEach(x -> assertEquals(expected, func.apply(input)));
        double totalMilliseconds = (double)System.currentTimeMillis() - (double)startTime;
        System.out.println(
                String.format(
                        "%s: %s ms (%s ms)",
                        testName,
                        totalMilliseconds / (double)numberOfIterations,
                        totalMilliseconds
                )
        );
    }
}

satish

Există mai multe modalități de a rezolva această problemă.Puteți utiliza funcția de divizare sau funcția de înlocuire a șirurilor de caractere.

Pentru mai multe informații, consultați problema Smilliar. http://techno-terminal.blogspot.in/2015/10/how-to-remove-spaces-from-given-string.html

Rakesh Chaudhari

Există și alte caractere spațiale care există în șiruri… Deci, este posibil să fie nevoie să înlocuim caracterele spațiale din șiruri.

De exemplu: NO-BREAK SPACE, THREE-PER-EM SPACE, PUNCTUATION SPACE

Iată lista caracterelor de spațiu http://jkorpela.fi/chars/spaces.html

Așadar, trebuie să modificăm

u2004 pentru SPAȚIUL DE TREI ÎNTREBĂRI

s.replaceAll(„[u0020u2004]”,””)

Abdur Rahman

Spațiul alb poate fi eliminat cu ajutorul funcției isWhitespace din clasa de caractere.

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

user9832813

Separați fiecare grup de text în propriile sale subșiruri și apoi concatenați aceste subșiruri:

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

Rajesh Gurbani
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;
}

Acest lucru ar putea fi de ajutor.

Deb

De asemenea, puteți arunca o privire la codul Java de mai jos. Următoarele coduri nu utilizează nicio metodă „încorporată”.

/**
 * 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));

    }
}

Input:

String inp = "01239Debashish123Pattn456aik";

Ieșire:

The String is: 01239123456

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


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

Kunal Vohra

Sunt furnizate destul de multe răspunsuri. Aș dori să dau o soluție care este destul de ușor de citit și mai bună decât regex.

import java.io.IOException;

import org.apache.commons.lang.StringUtils;

public class RemoveAllWhitespaceTest {

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

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

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

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

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

        System.out.println();

    }

}

Pranshu Singh

Puteți realiza acest lucru fără a utiliza replaceAll() sau orice altă metodă predefinită în Java.Acest mod este preferat:-

public class RemoveSpacesFromString {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String newString;
        String str = "prashant is good" ;
        int i;
        char[] strArray = str.toCharArray();
        StringBuffer sb =  new StringBuffer();

        for(i = 0; i<strArray.length; i++)
        {
            if(strArray[i]!= ' ' && strArray[i]!= 't')
            {
                sb.append(strArray[i]);
            }
        }
        System.out.println(sb);

        /*newString = str.replaceAll(" " , "");
        System.out.println(newString);*/
    }
}

Comentarii

  • dacă doriți să utilizați o scurtătură, atunci necomentați linia de cod 🙂 –  > Por Pranshu Singh.
Siva Sanjay Acchana
package com.sanjayacchana.challangingprograms;

public class RemoveAllWhiteSpacesInString {

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

}

Comentarii

  • Prin ce diferă acest răspuns de celelalte răspunsuri deja existente? –  > Por Matt.
HANU

Codul pe care îl doriți este

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

Acest lucru va elimina toate spațiile albe.

Comentarii

  • trebuie doar să vă faceți ecoul răspunsurilor de mai sus –  > Por JoeG.
edilon Junior

Dacă vrei să elimini toate spațiile albe din șir:

public String removeSpace(String str) {
    String result = "";
    for (int i = 0; i < str.length(); i++){
        char c = str.charAt(i);        
        if(c!=' ') {
            result += c;
        }
    }
    return result;
}

DEVNAG BHARAD

Încearcă asta:

String str="name=john age=13 year=2001";
String s[]=str.split(" ");
StringBuilder v=new StringBuilder();
for (String string : s) {
    v.append(string);
}
str=v.toString();

Comentarii

  • Ignori lucruri precum tabulatoarele, precum și toate diferitele moduri unicode de a specifica spațiul alb. –  > Por James Moore.