जावा स्ट्रिंग में एकल स्थान के साथ 2 या अधिक रिक्त स्थान को कैसे बदलें और अग्रणी और अनुगामी रिक्त स्थान को हटा दें


271

इस स्ट्रिंग को बदलने के लिए जावा में त्वरित, सरल तरीके की तलाश है

" hello     there   "

कुछ इस तरह दिखता है

"hello there"

जहां मैं उन सभी मल्टीपल स्पेस को सिंगल स्पेस के साथ बदल देता हूं, सिवाय इसके कि मैं स्ट्रिंग की शुरुआत में एक या एक से अधिक स्पेस चाहता हूं।

ऐसा कुछ मुझे वहां आंशिक रूप से मिलता है

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( )+", " ");

लेकिन काफी नहीं।


5
आपको उत्तर स्वीकार करने पर विचार करना चाहिए। यह पृष्ठ पर आने वाले लोगों के लिए बाद में एक निश्चित समाधान चुनने में बहुत आसान बनाता है।
पॉल रूनी

1
यह सबसे अनुशंसित तरीका है। => स्ट्रिंग nameWithProperSpacing = StringUtils.normalizeSpace (stringWithLotOfSpaces);
कुणाल वोहरा

s = s.replaceAll ("\\ s +", "");
सरोज कुमार साहू

जवाबों:


461

इसे इस्तेमाल करे:

String after = before.trim().replaceAll(" +", " ");

यह सभी देखें

  • String.trim()
    • स्ट्रिंग की एक प्रतिलिपि लौटाता है, जिसके साथ अग्रणी और अनुगामी व्हाट्सएप छोड़ा जाता है।
  • regular-expressions.info/Repetition

trim()रेगेक्स नहीं

यह सिर्फ एक के साथ ऐसा करना संभव है replaceAll, लेकिन यह trim()समाधान की तुलना में बहुत कम पठनीय है । फिर भी, यह केवल यह दिखाने के लिए यहां प्रदान किया गया है कि रेगेक्स क्या कर सकता है:

    String[] tests = {
        "  x  ",          // [x]
        "  1   2   3  ",  // [1 2 3]
        "",               // []
        "   ",            // []
    };
    for (String test : tests) {
        System.out.format("[%s]%n",
            test.replaceAll("^ +| +$|( )+", "$1")
        );
    }

3 विकल्प हैं:

  • ^_+ : स्ट्रिंग की शुरुआत में रिक्त स्थान का कोई भी क्रम
    • मिलान करें और बदलें $1, जो खाली स्ट्रिंग को कैप्चर करता है
  • _+$ : स्ट्रिंग के अंत में रिक्त स्थान का कोई भी क्रम
    • मिलान करें और बदलें $1, जो खाली स्ट्रिंग को कैप्चर करता है
  • (_)+ : रिक्त स्थान का कोई भी क्रम जो उपरोक्त में से किसी से भी मेल नहीं खाता है, जिसका अर्थ है कि यह मध्य में है
    • मिलान करें और बदलें $1, जो एक एकल स्थान को कैप्चर करता है

यह सभी देखें


11
+1, विशेष रूप से यह ध्यान देने योग्य है कि ऐसा करना trim()और फिर replaceAll()कम मेमोरी का उपयोग करने के बजाय इसे दूसरे तरीके से करना है। ज्यादा नहीं, लेकिन अगर इसे कई बार कहा जाता है, तो यह बढ़ सकता है, खासकर अगर "बहुत सारे ट्रिमेबल व्हाट्सएप" हैं। ( Trim()वास्तव में अतिरिक्त स्थान से छुटकारा नहीं मिलता है - यह सिर्फ शुरुआत और अंत मूल्यों को आगे char[]
बढ़ाकर

2
यह केवल एक विवरण है, लेकिन मुझे लगता है कि ( ) +या ( ){2,}(बहुत) थोड़ा और अधिक कुशल होना चाहिए?)
sp00m

6
अच्छा regexp। नोट: स्पेस की जगह `` \\sको वांछित चरित्र के साथ व्हाट्सएप के किसी भी समूह को बदल दिया जाएगा।
djmj

1
ध्यान दें कि () + भाग एकल स्थान से मेल खाएगा और इसे एकल स्थान से बदल देगा। शायद (<space> <space> +) बेहतर होगा इसलिए यह केवल तभी मेल खाता है जब कई स्थान होंगे और प्रतिस्थापन स्ट्रिंग में शुद्ध परिवर्तन करेगा।
ली मैदोर

2
जैसा कि ली मीडोर ने उल्लेख किया है, .trim().replaceAll(" +", " ")(दो स्थानों के .trim().replaceAll(" +", " ")साथ) एक स्थान से (एक स्थान के साथ ) तेज है । मैंने स्ट्रिंग्स पर टाइमिंग टेस्ट चलाए, जिसमें केवल सिंगल स्पेस और सभी डबल स्पेस थे, और बहुत सारे ऑपरेशन (लाखों या अधिक, पर्यावरण के आधार पर) करते हुए दोनों के लिए यह काफी तेजी से आया ।
गैरी एस।

154

आपको बस एक चाहिए:

replaceAll("\\s{2,}", " ").trim();

जहाँ आप एक या एक से अधिक स्थानों से मेल खाते हैं और उन्हें एक ही स्थान से जोड़ते हैं और फिर शुरुआत और अंत में व्हॉट्सएप ट्रिम करते हैं (आप वास्तव में पहले ट्रिमिंग द्वारा उल्टा कर सकते हैं और फिर रेग्क्स को जल्दी से बनाने के लिए मिलान कर सकते हैं जैसा कि किसी ने बताया)।

इसका परीक्षण करने के लिए जल्दी से प्रयास करें:

System.out.println(new String(" hello     there   ").trim().replaceAll("\\s{2,}", " "));

और यह वापस आ जाएगी:

"hello there"

3
मैं शायद पहले ट्रिम कर दूंगा क्योंकि तब आप regex को थोड़ा काम बचा रहे हैं।
माइकल

3
@ sarah.ferguson कृपया अंतिम ब्रैकेट को हटा दें ")" जो कि पहले प्रतिस्थापन में नहीं होना चाहिए। धन्यवाद। - सिस्टम मुझे ऐसा नहीं करने देगा! (6 वर्णों से कम कुछ भी एक संपादन के लिए योग्य नहीं है ..)
बौना

2
ध्यान दें कि यह एक स्थान को दूसरे स्थान के साथ मामले में प्रतिस्थापित करता है जहां एक साथ कई स्थान नहीं हैं। उस मामले में प्रतिस्थापन करने की कोई आवश्यकता नहीं है, हालांकि आप इसे चाहते हैं क्योंकि आप एक टैब को एक स्थान के साथ भी प्रतिस्थापित कर रहे हैं। केवल कई स्थानों को ही पहचानना अच्छा होगा।
ली मीडोर

2
@geowar ने टैब सॉरी के लिए सवाल कहां पूछा? मुझे यकीन है कि ऊपर as प्रतीकों की जगह उस बात के लिए नहीं है .. और न ही s ...
sarah.ferguson

2
एक दूसरे @geowar की प्रतीक्षा करें यह एक एकल तालिका को एक स्थान से बदल देता है। मैंने अभी इसे आजमाया
user1870400


20

इसने मेरे लिए पूरी तरह से काम किया: sValue = sValue.trim().replaceAll("\\s+", " ");


1
लोगों ने मेरे उत्तर को संपादित किया। मूल था: sValue = sValue.replaceAll ("\ s +", "") .trim ();
डॉक्टर

2
संपादित किया गया था क्योंकि आपका मूल उत्तर सभी रिक्त स्थान को हटा देता है और यही नहीं ओपी ने पूछा
जोस रुई सैंटोस

17
"[ ]{2,}"

यह एक से अधिक स्थानों से मेल खाएगा।

String mytext = " hello     there   ";
//without trim -> " hello there"
//with trim -> "hello there"
mytext = mytext.trim().replaceAll("[ ]{2,}", " ");
System.out.println(mytext);

उत्पादन:

hello there

13

शुरुआत में और स्ट्रिंग के अंत में रिक्त स्थान को खत्म करने के लिए, String#trim()विधि का उपयोग करें । और फिर अपने का उपयोग करें mytext.replaceAll("( )+", " ")


12

आप पहली बार उपयोग कर सकते हैं String.trim(), और फिर परिणाम पर रीजेक्स प्रतिस्थापित कमांड लागू कर सकते हैं ।


10
ट्रिम () स्ट्रिंग के शुरू और अंत में सभी स्थान को हटा देगा, यह शब्दों के बीच की जगह के लिए लागू नहीं होता है
vuhung3990

10

निम्नलिखित कोड शब्दों के बीच किसी भी व्हाट्सएप को कॉम्पैक्ट करेगा और स्ट्रिंग की शुरुआत और अंत में किसी भी को हटा देगा

String input = "\n\n\n  a     string with     many    spaces,    \n"+
               " a \t tab and a newline\n\n";
String output = input.trim().replaceAll("\\s+", " ");
System.out.println(output);

यह आउटपुट करेगा a string with many spaces, a tab and a newline

ध्यान दें कि रिक्त स्थान, टैब और newlines सहित किसी भी गैर-मुद्रण योग्य वर्णों को संकुचित या हटा दिया जाएगा


अधिक जानकारी के लिए संबंधित दस्तावेज देखें:


9

इसको आजमाओ।

नमूना कोड

String str = " hello     there   ";
System.out.println(str.replaceAll("( +)"," ").trim());

आउटपुट

hello there

पहले यह सभी जगहों को सिंगल स्पेस से बदल देगा। इससे पहले हमें ट्रिम करना होगा Stringक्योंकि इसके शुरू होने Stringऔर खत्म होने पर Stringसिंगल स्पेस के साथ सभी स्पेस को बदल दिया जाएगा अगर Stringस्टार्टिंग Stringएंड द एंड में स्पेस है Stringतो हमें उन्हें ट्रिम करने की जरूरत है। आपकी इच्छा Stringके अनुसार


4

आप लुकरॉइड्स का भी उपयोग कर सकते हैं।

test.replaceAll("^ +| +$|(?<= ) ", "");

या

test.replaceAll("^ +| +$| (?= )", "")

<space>(?= )एक अंतरिक्ष चरित्र से मेल खाता है जो एक और अंतरिक्ष चरित्र द्वारा पीछा किया जाता है। इसलिए लगातार स्थानों में, यह अंतिम को छोड़कर सभी स्थानों से मेल खाता है क्योंकि इसके बाद एक अंतरिक्ष चरित्र नहीं है। यह आपको हटाने के ऑपरेशन के बाद लगातार रिक्त स्थान के लिए एक ही स्थान छोड़ रहा है।

उदाहरण:

    String[] tests = {
            "  x  ",          // [x]
            "  1   2   3  ",  // [1 2 3]
            "",               // []
            "   ",            // []
        };
        for (String test : tests) {
            System.out.format("[%s]%n",
                test.replaceAll("^ +| +$| (?= )", "")
            );
        }

जिस तरह से आपके पास है, यह आगे या अंत या इसके बाद किसी अन्य स्थान के साथ किसी भी स्थान (स्थानों) से मेल खाएगा। इसका मतलब है कि "ए .... बी" 3 बार मिलान करेगा और तीन बार बदल देगा। यह प्रतिस्थापन () विधि के अंदर सभी आंतरिक स्थानों पर पुनरावृत्त करता है। शायद आप इसे 2 या अधिक रिक्त स्थान के किसी भी क्रम से मेल खाने के लिए बदल सकते हैं और आंतरिक पुनरावृत्ति को कम कर सकते हैं।
ली मीडोर

शायद <space> + (? = <Space>) ऐसा करेगा।
ली मीडोर

4

ट्रिम ()

केवल प्रमुख और अनुगामी रिक्त स्थान को निकालता है।

जावा डॉक से, "एक स्ट्रिंग लौटाता है जिसका मूल्य यह स्ट्रिंग है, जिसमें किसी भी अग्रणी और अनुगामी व्हाट्सएप को हटा दिया जाता है।"

System.out.println(" D ev  Dum my ".trim());

"डी एवी दम मेरा"

प्रतिस्थापित करें (), प्रतिस्थापित करें ()

शब्द में सभी खाली तारों को बदल देता है,

System.out.println(" D ev  Dum my ".replace(" ",""));

System.out.println(" D ev  Dum my ".replaceAll(" ",""));

System.out.println(" D ev  Dum my ".replaceAll("\\s+",""));

आउटपुट:

"DevDummy"

"DevDummy"

"DevDummy"

नोट: "\ s +" खाली स्थान वर्ण के समान नियमित अभिव्यक्ति है।

संदर्भ: https://www.codedjava.com/2018/06/replace-all-spaces-in-string-trim.html


4

अब तक बहुत सारे सही उत्तर दिए गए हैं और मुझे बहुत सारे उत्थान देखने को मिले हैं। हालांकि, उल्लिखित तरीके काम करेंगे लेकिन वास्तव में अनुकूलित या वास्तव में पठनीय नहीं हैं। मैं हाल ही में समाधान पर आया था जो हर डेवलपर को पसंद आएगा।

String nameWithProperSpacing = StringUtils.normalizeSpace( stringWithLotOfSpaces );

आप कर चुके हैं। यह पठनीय समाधान है।


3

कोटलिन में यह इस तरह दिखेगा

val input = "\n\n\n  a     string with     many    spaces,    \n"
val cleanedInput = input.trim().replace(Regex("(\\s)+"), " ")

2
String str = " hello world"

पहले रिक्त स्थान कम करें

str = str.trim().replaceAll(" +", " ");

पहले अक्षर को बड़ा करें और बाकी सब को कम करें

str = str.substring(0,1).toUpperCase() +str.substring(1,str.length()).toLowerCase();

2
mytext = mytext.replaceAll("\\s+"," ");

कोड-केवल उत्तर हतोत्साहित किए जाते हैं। कृपया संपादित करें पर क्लिक करें और कुछ शब्दों को जोड़कर बताएं कि आपका कोड प्रश्न को कैसे संबोधित करता है, या शायद यह बताएं कि आपका उत्तर पिछले उत्तरों से कैसे भिन्न है। साभार
निक

1

इसने मेरे लिए काम किया

scan= filter(scan, " [\\s]+", " ");
scan= sac.trim();

जहां फिल्टर फंक्शन का अनुसरण कर रहा है और स्कैन इनपुट स्ट्रिंग है:

public String filter(String scan, String regex, String replace) {
    StringBuffer sb = new StringBuffer();

    Pattern pt = Pattern.compile(regex);
    Matcher m = pt.matcher(scan);

    while (m.find()) {
        m.appendReplacement(sb, replace);
    }

    m.appendTail(sb);

    return sb.toString();
}

1
यह एक स्थान के साथ <space> <टैब> को प्रतिस्थापित करेगा लेकिन <टैब> <टैब> को नहीं। यह एक मामूली समस्या है, ऐसा लगता है।
ली मीडोर

1

आपको इसे इस तरह करना चाहिए

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( +)", " ");

राउंड ब्रैकेट के अंदर + लगाएं।



0

देख लो String.replaceAll

रेगेक्स का उपयोग करें "\s"और उसके साथ बदलें " "

फिर उपयोग करें String.trim


1
नया स्ट्रिंग ("हैलो वहाँ") .replaceAll ("\\ s", "+") एक + हैलो ++++++++++++++ तो निश्चित रूप से काम नहीं करता है ..
sarah.ferguson

1
कोशिशnew String(" hello there ").trim().replaceAll("\\s+", " ")
मनीष_

0

इसे देखो...

public static void main(String[] args) {
    String s = "A B  C   D    E F      G\tH I\rJ\nK\tL";
    System.out.println("Current      : "+s);
    System.out.println("Single Space : "+singleSpace(s));
    System.out.println("Space  count : "+spaceCount(s));
    System.out.format("Replace  all = %s", s.replaceAll("\\s+", ""));

    // Example where it uses the most.
    String s = "My name is yashwanth . M";
    String s2 = "My nameis yashwanth.M";

    System.out.println("Normal  : "+s.equals(s2));
    System.out.println("Replace : "+s.replaceAll("\\s+", "").equals(s2.replaceAll("\\s+", "")));

} 

यदि स्ट्रिंग में केवल एकल-स्थान है तो प्रतिस्थापित करें () नहीं बदलेगा,

यदि रिक्त स्थान एक से अधिक हैं, तो प्रतिस्थापन () कार्रवाई करता है और चंचलता को हटाता है।

public static String singleSpace(String str){
    return str.replaceAll("  +|   +|\t|\r|\n","");
}

एक स्ट्रिंग में रिक्त स्थान की संख्या की गणना करने के लिए।

public static String spaceCount(String str){
    int i = 0;
    while(str.indexOf(" ") > -1){
      //str = str.replaceFirst(" ", ""+(i++));
        str = str.replaceFirst(Pattern.quote(" "), ""+(i++)); 
    }
    return str;
}

पैटर्न .quote ("?") शाब्दिक पैटर्न स्ट्रिंग देता है।


0

इससे पहले कि मैं एक बेहतर समाधान के रूप में रेगेक्स का उपयोग करते हुए दूसरा उत्तर पाया मेरी विधि। शायद किसी को इस कोड की आवश्यकता है।

private String replaceMultipleSpacesFromString(String s){
    if(s.length() == 0 ) return "";

    int timesSpace = 0;
    String res = "";

    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);

        if(c == ' '){
            timesSpace++;
            if(timesSpace < 2)
                res += c;
        }else{
            res += c;
            timesSpace = 0;
        }
    }

    return res.trim();
}

दिलचस्प है, लेकिन सफेद स्थान का मतलब सिर्फ खाली जगह से अधिक है।
लॉर इवान

@LaurIvan तुम्हारा क्या मतलब है?
ट्रिनिटी ४२०

इस प्रविष्टि\s में नियमित अभिव्यक्तियों (स्पेस, टैब, नई लाइन, फॉर्म फीड) के बारे में अच्छी व्याख्या है ।
लॉर इवान

@LaurIvan आपका लिंक टूट गया है लेकिन आप सही हैं। मुझे लगता है कि हर गैर-वर्णनात्मक, गैर-संख्यात्मक और गैर-अंतरिक्ष चरित्र को हटाकर, इनपुट स्ट्रिंग के माध्यम से पुनरावृत्ति करके इस समस्या को हल किया जा सकता है।
ट्रिनिटी ४२०

0

स्ट्रीम संस्करण, फ़िल्टर रिक्त स्थान और टैब।

Stream.of(str.split("[ \\t]")).filter(s -> s.length() > 0).collect(Collectors.joining(" "))

0
String myText = "   Hello     World   ";
myText = myText.trim().replace(/ +(?= )/g,'');


// Output: "Hello World"

0

स्ट्रिंग में कहीं भी सफेद स्थान को हटाने के लिए सबसे सरल विधि।

 public String removeWhiteSpaces(String returnString){
    returnString = returnString.trim().replaceAll("^ +| +$|( )+", " ");
    return returnString;
}

-1
public class RemoveExtraSpacesEfficient {

    public static void main(String[] args) {

        String s = "my    name is    mr    space ";

        char[] charArray = s.toCharArray();

        char prev = s.charAt(0);

        for (int i = 0; i < charArray.length; i++) {
            char cur = charArray[i];
            if (cur == ' ' && prev == ' ') {

            } else {
                System.out.print(cur);
            }
            prev = cur;
        }
    }
}

उपरोक्त समाधान किसी भी जावा फ़ंक्शन का उपयोग किए बिना ओ (एन) की जटिलता के साथ एल्गोरिथ्म है।


-1

कृपया नीचे दिए गए कोड का उपयोग करें

package com.myjava.string;

import java.util.StringTokenizer;

public class MyStrRemoveMultSpaces {

    public static void main(String a[]){

        String str = "String    With Multiple      Spaces";

        StringTokenizer st = new StringTokenizer(str, " ");

        StringBuffer sb = new StringBuffer();

        while(st.hasMoreElements()){
            sb.append(st.nextElement()).append(" ");
        }

        System.out.println(sb.toString().trim());
    }
}

-1

हैलो देरी के लिए खेद है! यहाँ सबसे अच्छा और सबसे कुशल उत्तर है जिसे आप ढूंढ रहे हैं:

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

public class MyPatternReplace {

public String replaceWithPattern(String str,String replace){

    Pattern ptn = Pattern.compile("\\s+");
    Matcher mtch = ptn.matcher(str);
    return mtch.replaceAll(replace);
}

public static void main(String a[]){
    String str = "My    name    is  kingkon.  ";
    MyPatternReplace mpr = new MyPatternReplace();
    System.out.println(mpr.replaceWithPattern(str, " "));
}

तो इस उदाहरण का आपका आउटपुट होगा: मेरा नाम किंगकोन है।

हालाँकि यह तरीका "स्ट्रिंग" को भी हटा देगा। तो अगर आप नहीं चाहते कि बस इस सरल विधि का उपयोग करें:

while (str.contains("  ")){  //2 spaces
str = str.replace("  ", " "); //(2 spaces, 1 space) 
}

और अगर आप प्रमुख और पीछे चल रहे स्थानों को भी जोड़ना चाहते हैं तो बस जोड़ें:

str = str.trim();

-1

मुझे पता है कि प्रतिस्थापन विधि बहुत आसान है, लेकिन मैं इसे भी पोस्ट करना चाहता था।

public static String removeExtraSpace(String input) {
    input= input.trim();
    ArrayList <String> x= new ArrayList<>(Arrays.asList(input.split("")));
    for(int i=0; i<x.size()-1;i++) {
        if(x.get(i).equals(" ") && x.get(i+1).equals(" ")) { 
            x.remove(i); 
            i--; 
        }
    }
    String word="";
    for(String each: x) 
        word+=each;
    return word;
}

1
भले ही यह काम करता है, यह सबसे आसान समाधान से दूर है।
प्लैटज़ेरश

-1

स्ट्रिंग टोकेनाइजर का उपयोग किया जा सकता है

 String str = "  hello    there  ";
            StringTokenizer stknzr = new StringTokenizer(str, " ");
            StringBuffer sb = new StringBuffer();
            while(stknzr.hasMoreElements())
            {
                sb.append(stknzr.nextElement()).append(" ");
            }
            System.out.println(sb.toString().trim());
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.