2010-03-03 19 views
6

के साथ कई श्वेतस्थानों को प्रतिस्थापित करता है, मैं गैर-ब्रेकिंग रिक्त स्थान वाले एकाधिक रिक्त स्थान को बदलने का जावा रेगेक्स तरीका ढूंढ रहा हूं। दो या दो से अधिक सफेद जगहों को उसी नॉन-ब्रेकिंग रिक्त स्थान के साथ प्रतिस्थापित किया जाना चाहिए, लेकिन एकल सफेद जगहों को प्रतिस्थापित नहीं किया जाना चाहिए। इसे किसी भी प्रकार की सफेद जगहों के लिए काम करने की ज़रूरत है। और पहले अक्षर 1 या अधिक सफेद जगह हो सकते हैं।जावा रेगेक्स जो गैर-ब्रेकिंग स्पेस

तो मेरी स्ट्रिंग इस तरह शुरू होता है, तो:

TESTING THIS OUT WITH DIFFERENT  CASES 

मैं नए स्ट्रिंग की जरूरत है इस तरह देखने के लिए:

TESTING THIS  OUT   WITH    DIFFERENT     CASES 
+0

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

उत्तर

2

तुम भी सभी को एक साथ regex को छोड़ सकता है: मेरी मशीन पर, जावा 1.6 के साथ, मैं उम्मीद परिणाम मिलता है।

String testStr = "TESTING THIS OUT WITH DIFFERENT  CASES"; 
String _replaced = testStr.replace(" ", "  "); 
String replaced = _replaced.replace("  ", "  "); 

मैंने इसका परीक्षण नहीं किया है, लेकिन पहले व्यक्ति को दो रिक्त स्थान के सभी मामले मिलते हैं और उन्हें गैर-ब्रेकिंग रिक्त स्थान के साथ बदल दिया जाता है। दूसरे को ऐसे मामले मिलते हैं जहां सफेद जगहों की एक विषम संख्या थी और इसे दो एनबीपीएस के साथ सुधारता था।

2

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


मूल नीचे जवाब:

सबसे सरल तरीका है कि मैं के बारे में सोच सकते हैं एक दो कदम विधि है।

सबसे पहले, "& nbsp;" के साथ सभी रिक्त स्थान बदलें। यह बहुत तेज़ है क्योंकि इसे रेगेक्स नहीं होना चाहिए।

String testStr = "TESTING THIS OUT WITH DIFFERENT  CASES"; 
String replaced = testStr.replace(" ", " "); 

इसके बाद, के किसी एक उदाहरणों की जगह "& nbsp;" रिक्त स्थान के साथ।

String replaced2 = replaced.replaceAll("\\b \\b", " "); 
System.out.println(replaced2); 

परिणाम:

TESTING THIS  OUT   WITH    DIFFERENT     CASES 
+0

यह बहुत अच्छी तरह से काम करता है। मैं बस सोच रहा हूं कि एक शब्द सीमा क्या है। अगर मैं स्ट्रिंग में कुछ गैर-अल्फा वर्ण फेंकना शुरू करता हूं, तो क्या यह अभी भी इसे सही तरीके से संभाल देगा? – Shane

+0

यह एक अच्छा मुद्दा है; विराम चिह्न इसे पूरी तरह से तोड़ देगा। और यह विराम चिह्न को संभाल नहीं सकता है क्योंकि ' ' स्वयं अर्धविराम से समाप्त होता है, इसलिए यह अधिक बैकट्रैकिंग लेगा। और यदि आप बैकट्रैक पर जा रहे हैं, तो आप सर्ज की तरह एक कदम में भी ऐसा कर सकते हैं। एक संदर्भ के रूप में उत्तर छोड़कर, लेकिन विकी में परिवर्तित। –

4

चलो कुछ regex (? काला) जादू का उपयोग करते हैं।

String testStr = "TESTING THIS OUT WITH DIFFERENT  CASES"; 
Pattern p = Pattern.compile(" (?=)|(?<=) "); 
Matcher m = p.matcher(testStr); 
String res = m.replaceAll("&nbsp;"); 

पैटर्न या तो किसी अन्य के बाद एक सफेद जगह या एक सफेद स्थान के लिए दिखता है। इस तरह यह एक अनुक्रम में सभी रिक्त स्थान पकड़ता है।

TESTING THIS&nbsp;&nbsp;OUT&nbsp;&nbsp;&nbsp;WITH&nbsp;&nbsp;&nbsp;&nbsp;DIFFERENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CASES 
संबंधित मुद्दे