2011-02-03 17 views
18

"HelloWorld" से "Hello World" को कैसे घुमाएं। विभाजन को ऊपरी-केस अक्षरों के आधार पर होना चाहिए, लेकिन पहले अक्षर को बाहर करना चाहिए।कैपिटल लेटर के बाद स्पेस डालें

पीएस: मुझे String.split का उपयोग करने और फिर संयोजन करने के बारे में पता है। बस यह जानना चाहता था कि कोई बेहतर तरीका है या नहीं।

+0

पोस्टिंग वाक्य - विन्यास। लेकिन मुझे यकीन है कि एक नियमित अभिव्यक्ति लिखना बहुत आसान होगा जो पूंजी पत्र की तलाश करेगा (जो वाक्य की शुरुआत में नहीं है) और इससे पहले एक जगह जोड़ें। – DaveJohnston

+1

क्या आप 'कन्वर्ट ("हेल्लो") == "एच ई एल एल ओ" की उम्मीद करते हैं? – vz0

+0

@ vz0: असल में मेरे स्ट्रिंग के ऊपरी मामलों के बीच कुछ कम मामला होगा। – Emil

उत्तर

57
String output = input.replaceAll("(\\p{Ll})(\\p{Lu})","$1 $2"); 

एक अपरकेस अक्षर द्वारा follwed एक छोटा अक्षर के लिए यह regex खोज और उन्हें पूर्व, एक अंतरिक्ष और बाद (प्रभावी रूप से उन्हें एक स्थान के साथ अलग करने) के साथ बदल देता है। यह प्रत्येक संदर्भ को पीछे संदर्भों ($1 और $2) के माध्यम से प्रतिस्थापन स्ट्रिंग में मानों का दोबारा उपयोग करने में सक्षम होने के लिए कैप्चरिंग समूह () में रखता है।

ऊपरी लगाने के लिए और छोटे अक्षरों यह \p{Ll} और \p{Lu} (बजाय [a-z] और [A-Z]) का उपयोग करता है, क्योंकि यह यूनीकोड ​​मानक में सभी ऊपरी और छोटे अक्षरों और न सिर्फ ASCII रेंज में लोगों को संभालती है (this nice explanation of Unicode in regexes ज्यादातर जावा पर भी लागू होता है)।

+0

+1 वास्तव में स्मार्ट समाधान! – Nishant

+0

पूर्ण स्पष्टीकरण के लिए +1 –

1

यदि आप नियमित अभिव्यक्तियों का उपयोग नहीं करना चाहते हैं तो आप स्ट्रिंग में वर्णों के माध्यम से लूप कर सकते हैं, उन्हें स्ट्रिंगबिल्डर में जोड़ना (और स्ट्रिंग बिल्डर को एक स्थान जोड़ना यदि आप पूंजी पत्र में आते हैं जो पहले नहीं है) :

String s = "HelloWorld"; 
StringBuilder result = new StringBuilder(); 
for(int i=0 ; i<s.length() ; i++) { 
    char c = s.charAt(i); 
    if(i!=0&&Character.isUpperCase(c)) { 
     result.append(' '); 
    } 
    result.append(c); 
} 
+0

मुझे इस विधि से अवगत है, जैसा कि मैंने p.s में उल्लेख किया है। – Emil

+0

@Emil - आपने कहा था कि आप स्ट्रिंग स्प्लिट का उपयोग करने के बारे में जानते थे और फिर संयोजन करते थे, यह विधि एक बार विभाजित नहीं होती है, न ही यह इसके व्यवहार का अनुकरण करती है! – berry120

+0

क्षमा करें मुझे यह नहीं पता था। – Emil

0

स्यूडोकोड:

String source = ...; 
String result = ""; 

// FIXME: check for enf-of-source 

for each letter in source { 
    while current letter not uppercase { 
     push the letter to result; 
     advance one letter; 
    } 
    if not the first letter { 
     push space to result; 
    } 
    push the letter to result; 
} 
4

बेहतर व्यक्तिपरक है। इस कोड के कुछ अधिक लाइनों लेता है: एक उपयोगिता वर्ग में

public static String deCamelCasealize(String camelCasedString) { 
    if (camelCasedString == null || camelCasedString.isEmpty()) 
     return camelCasedString; 

    StringBuilder result = new StringBuilder(); 
    result.append(camelCasedString.charAt(0)); 
    for (int i = 1; i < camelCasedString.length(); i++) { 
     if (Character.isUpperCase(camelCasedString.charAt(i))) 
     result.append(" "); 
     result.append(camelCasedString.charAt(i)); 
    } 
    return result.toString(); 
} 

छिपाएं इस बदसूरत कार्यान्वयन और एक API (उपयोगकर्ता के दृष्टिकोण से ठीक लग रहा है;) के रूप में उपयोग)

+0

इसे एक अच्छा कार्यान्वयन +1 करता है लेकिन मैं regex पसंद करता हूं। मुझे बस कुछ तारों को गुप्त करना होगा। – Emil

2
String s = "HelloWorldNishant"; 
    StringBuilder out = new StringBuilder(s); 
    Pattern p = Pattern.compile("[A-Z]"); 
    Matcher m = p.matcher(s); 
    int extraFeed = 0; 
    while(m.find()){ 
     if(m.start()!=0){ 
      out = out.insert(m.start()+extraFeed, " "); 
      extraFeed++; 
     } 
    } 
    System.out.println(out); 

प्रिंट

बल्कि जवाब से क्योंकि मैं नहीं जानता कि एक टिप्पणी के रूप

नमस्ते विश्व निशांत

संबंधित मुद्दे