जावा का उपयोग करके स्ट्रिंग में डुप्लिकेट सफेद रिक्त स्थान कैसे निकालें?


147

जावा का उपयोग करके डुप्लिकेट सफेद रिक्त स्थान (टैब्स, न्यूलाइन, स्पेस, आदि ...) को एक स्ट्रिंग में कैसे निकालें?

जवाबों:


378

ऐशे ही:

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

उदाहरण के लिए

System.out.println("lorem  ipsum   dolor \n sit.".replaceAll("\\s+", " "));

आउटपुट

lorem ipsum dolor sit.

इसका क्या \s+मतलब है?

\s+एक नियमित अभिव्यक्ति है। \sएक स्थान, टैब, नई लाइन, कैरिज रिटर्न, फॉर्म फीड या वर्टिकल टैब से मेल खाता है, और +कहता है "एक या एक से अधिक"। इस प्रकार उपरोक्त कोड सभी "व्हाट्सएप सब्सट्रिंग्स" को एक ही वर्ण के साथ एक वर्ण से अधिक समय तक ध्वस्त कर देगा।


स्रोत: जावा: स्ट्रिंग्स में डुप्लिकेट सफेद रिक्त स्थान को हटा रहा है


3
@SuhrobSamiev - String.replaceAll () JDK 1.4 के बाद से जावा में है। docs.oracle.com/javase/1.4.2/docs/api/java/lang/… , java.lang.String)
डेविड मोल्स

3
मेरी इच्छा है कि मैं \ _ + के भयानक विवरण के लिए +1 से अधिक जोड़ सकता हूं।
Cyntech

मैं समझ गया, \s+लेकिन 2 बैकस्लैश \\ का क्या मतलब है?
सैपलिंगप्रो

2
स्ट्रिंग शाब्दिक "\\"एक एकल बैकस्लैश से युक्त स्ट्रिंग का प्रतिनिधित्व करता है। तो \s+आपको लिखने का प्रतिनिधित्व करने के लिए "\\s+"
aioobe

1
क्या इससे गाड़ी वापस आएगी? या मुझे अलग से "\\ r" निकालना होगा? धन्यवाद!
user3388884

24

आप रेगेक्स का उपयोग कर सकते हैं

(\s)\1

तथा

से बदल दो $1

जावा कोड:

str = str.replaceAll("(\\s)\\1","$1");

यदि इनपुट है "foo\t\tbar "तो आप "foo\tbar "आउटपुट के रूप में प्राप्त करेंगे
लेकिन यदि इनपुट है तो "foo\t bar"यह अपरिवर्तित रहेगा क्योंकि इसमें लगातार व्हाट्सएप वर्ण नहीं हैं।

यदि आप सभी व्हाट्सएप कैरेक्टर (स्पेस, वर्टिकल टैब, हॉरिजॉन्टल टैब, कैरिज रिटर्न, फॉर्म फीड, नई लाइन) को स्पेस के रूप में मानते हैं तो आप किसी भी नंबर की लगातार व्हाइट स्पेस को सिंगल स्पेस से रिप्लेस करने के लिए निम्न रेगेक्स का उपयोग कर सकते हैं :

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

लेकिन अगर आप एक ही जगह के साथ दो लगातार सफेद जगह बदलना चाहते हैं, तो आपको यह करना चाहिए:

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

9

इसे आजमाएं - आपको करना है import java.util.regex.*;

    Pattern pattern = Pattern.compile("\\s+");
    Matcher matcher = pattern.matcher(string);
    boolean check = matcher.find();
    String str = matcher.replaceAll(" ");

stringआपका स्ट्रिंग कहां है जिस पर आपको डुप्लिकेट सफेद रिक्त स्थान को निकालने की आवश्यकता है


9

हाय सबसे तेज (लेकिन सबसे सुंदर तरीका नहीं) मुझे मिला है

while (cleantext.indexOf("  ") != -1)
  cleantext = StringUtils.replace(cleantext, "  ", " ");

यह एक रेगेक्स के विपरीत एंड्रॉइड पर बहुत तेज चल रहा है


1
केवल रिक्त स्थान के लिए काम करता है लेकिन अन्य व्हाट्सएप जैसे टैब और न्यूलाइन्स नहीं।
पैंग

1
मुझे पता है, आपको अन्य संस्थाओं के लिए लूप करते समय इनमें से अधिक जोड़ना होगा। लेकिन यह कोड इन रेगेक्स के रूप में एंड्रॉइड पर बहुत तेज़ी से चलता है, मुझे पूर्ण ईबुक की प्रक्रिया करनी थी।
वुत्जेबेर

डेस्कटॉप पर भी तेजी से। यह एक बड़ी स्ट्रिंग के लिए परीक्षण नहीं किया गया है, लेकिन अगर आप इसे बहुत छोटे तारों पर चलाने की योजना बना रहे हैं, तो यह वह उत्तर है जिसकी आपको तलाश है।
प्रकाशित

9
String str = "   Text    with    multiple    spaces    ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"

6

हालांकि यह बहुत देर हो चुकी है, मैंने एक बेहतर समाधान (जो मेरे लिए काम करता है) पाया है जो अपने प्रकार के एक सफेद स्थान के साथ लगातार सभी एक ही प्रकार के सफेद रिक्त स्थान को बदल देगा। अर्थात्:

   Hello!\n\n\nMy    World  

होगा

 Hello!\nMy World 

नोटिस अभी भी सफेद रिक्त स्थान के लिए अग्रणी और पीछे हैं। तो मेरा पूरा समाधान है:

str = str.trim().replaceAll("(\\s)+", "$1"));

यहाँ, trim()"" के साथ सभी प्रमुख और अनुगामी श्वेत अंतरिक्ष तारों को प्रतिस्थापित करता है। समूह # 1 में (\\s)कैप्चरिंग के लिए है \\s(जो कि सफेद रिक्त स्थान है जैसे '', '\ n', '\ t') । साइन 1 या अधिक पूर्ववर्ती टोकन के मिलान के लिए है। तो किसी भी सफेद अंतरिक्ष वर्ण ('', '\ n' या '\ t') के बीच लगातार वर्ण (1 या अधिक) हो सकते हैं। मिलान प्रकार के समूह # 1 स्ट्रिंग (जिसमें केवल 1 श्वेत स्थान वर्ण होता है) के साथ स्ट्रिंग को बदलने के लिए है (जो कि मिलान किए गए एकल सफेद स्थान वर्ण है)। उपरोक्त समाधान इस तरह से बदल जाएगा:+(\\s)+$1

   Hello!\n\n\nMy    World  

होगा

Hello!\nMy World

मुझे अपना उपरोक्त समाधान यहां नहीं मिला है इसलिए मैंने इसे पोस्ट किया है।


0

यदि आप सभी प्रमुख और अनुगामी व्हाट्सएप से छुटकारा पाना चाहते हैं तो आप कुछ इस तरह करना चाहते हैं:

// \\A = Start of input boundary
// \\z = End of input boundary 
string = string.replaceAll("\\A\\s+(.*?)\\s+\\z", "$1");

फिर आप यहां सूचीबद्ध अन्य रणनीतियों का उपयोग करके डुप्लिकेट को हटा सकते हैं:

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

0

आप किसी भी स्थान, टैब, न्यूलाइन और सभी के लिए स्ट्रिंग टोकनर का उपयोग करने का भी प्रयास कर सकते हैं। एक सरल तरीका है,

String s = "Your Text Here";        
StringTokenizer st = new StringTokenizer( s, " " );
while(st.hasMoreTokens())
{
    System.out.print(st.nextToken());
}

-10

यह तीन चरणों में संभव हो सकता है:

  1. स्ट्रिंग को कैरेक्टर ऐरे में परिवर्तित करें (ToCharArray)
  2. चारित्र सरणी पर लूप के लिए आवेदन करें
  3. फिर स्ट्रिंग बदलें फ़ंक्शन लागू करें (बदलें ("स्टिंग आप बदलना चाहते हैं", "मूल स्ट्रिंग"));

1
यह एक अच्छा समाधान नहीं है, एक चार सरणी के लिए छोड़ने से कुछ भी हल नहीं होता है। आप वास्तव में यह नहीं समझा रहे हैं कि किस तरह से प्रतिस्थापन किया जाए, जो समस्या का मूल है। इसके अलावा कृपया पूरी तरह से असंबंधित लिंक पोस्ट न करें । यदि आप ऐसा करते हैं तो आप स्पैमर के रूप में फ़्लैग हो जाएंगे।
मैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.