2012-12-05 20 views
5

मैं स्ट्रिंग को गैर-वर्णमाला वर्णों के साथ एक स्ट्रिंग सरणी में विभाजित करना चाहता हूं। उदाहरण के लिए:गैर-वर्णानुक्रम अक्षरों पर जावा स्ट्रिंग स्प्लिट

"Here is an [email protected]" => "Here", "is", "an" "ex", "mple" 

मैं नियमित अभिव्यक्ति "(?![\\p{Alpha}])" साथ String.split(String regex) विधि का उपयोग करने की कोशिश की। हालांकि यह स्ट्रिंग को

"Here", "_is", "_an", "_ex", "@ample" 

(उन अंडरस्कोर पर जोर देना है कि वहां एक जगह है)। मुझे लगता है कि ऐसा इसलिए है क्योंकि ?! रेगेक्स ऑपरेटर "शून्य-चौड़ाई" है और वास्तव में इनपुट स्ट्रिंग में गैर-वर्णमाला वर्णों से पहले शून्य-चौड़ाई वाले वर्ण को विभाजित और हटा रहा है।

स्ट्रिंग को विभाजित करते समय मैं वास्तविक गैर-अल्फा वर्णों को हटाने को कैसे पूरा कर सकता हूं? क्या कोई गैर-शून्य-चौड़ाई अस्वीकरण ऑपरेटर है?

+0

क्या \ W + काम करता है? – Thilo

+0

http://stackoverflow.com/questions/11332772/java-string-split-on-all-non-alphanumeric-except-apostrophes –

+0

@ थिलो यह अंडरस्कोर – arshajii

उत्तर

11

आप की कोशिश कर सकते \P{Alpha}+:

"Here is an [email protected]".split("\\P{Alpha}+") 
 
["Here", "is", "an", "ex", "mple"] 

\P{Alpha} (के रूप में \p{Alpha}, जो किसी भी वर्णमाला अक्षर से मेल खाता के खिलाफ) किसी भी गैर अक्षरात्मक अक्षर से मेल खाता। + इंगित करता है कि हमें ऐसे पात्रों की किसी भी सतत स्ट्रिंग पर विभाजित होना चाहिए।

"[email protected]#$%^&*b".split("\\P{Alpha}+") 
 
["a", "b"] 
+0

के साथ काम नहीं करेगा जो पूरी तरह से काम करता है। सुझाव और स्पष्टीकरण के लिए धन्यवाद! – dmoench

+0

अगर मैं "मैडम, मैं एडम हूं" में डालता हूं तो यह कॉमा और एस्ट्रोफ़े को मारता है, लेकिन "मैडम" के बाद और "मैं हूं" के बाद जगह रखता हूं। क्या यह अपेक्षित व्यवहार है, या विभाजन के साथ कुछ भद्दा है? अगर मैं "| \\ s +" में जोड़ता हूं तो यह व्हाइटस्पेस को मारता नहीं है। – Ungeheuer

0

नहीं चाहेंगे

"Here is an [email protected]".split("\\S\\w+") 

काम: उदाहरण के लिए?

0

अन्य उत्तरों के अलावा, आप स्ट्रिंग में वर्णों को फिर से सक्रिय कर सकते हैं, परीक्षण करें कि उनके ASCII मान निम्न और ऊपरी केस अक्षरों की सीमा में हैं, और यदि आपका नहीं, तो वांछित 'विभाजित' व्यवहार करें।

char[] chars = str.toCharArray(); उपयोगी हो सकता है।

2

यहां पहले से ही कई उत्तर हैं, लेकिन उनमें से कोई भी अंतर्राष्ट्रीयकरण के मुद्दों से अच्छा व्यवहार नहीं करता है। और यहां तक ​​कि यदि ओपी उदाहरण से यह माना जा सकता है कि यह "अंग्रेजी" अक्षरों के बारे में था, तो हो सकता है कि आगंतुकों को खोज से यहां आने का मामला न हो ...

... तो, जावा का उल्लेख करने लायक है Unicode Technical Standard #18 "Unicode Regular Expressions" का समर्थन करता है। बहुत प्रभावित है ना? स्पष्ट रूप से, यह अंतरराष्ट्रीय पात्रों से निपटने के लिए नामित क्लासिक (लैटिन-केंद्रित या घटना अंग्रेजी-केंद्रित) नियमित अभिव्यक्तियों का विस्तार है।

उदाहरण के लिए, Java supports the full set of binary properties यह जांचने के लिए कि कोई वर्ण यूनिकोड कोड पॉइंट वर्ण वर्गों में से एक है या नहीं। विशेष रूप से \p{IsAlphabetic} वर्ण वर्ग किसी भी यूनिकोड-समर्थित लैंगेज में किसी पत्र से संबंधित वर्णमाला वर्ण से मेल खाता है।

स्पष्ट नहीं है?

Pattern p = Pattern.compile("\\p{IsAlphabetic}+"); 
    //       ^^^^^^^^^^^^^^^^^ 
    //       any alphabetic character 
    //     (in any Unicode-supported language) 

    Matcher m = p.matcher("L'élève あゆみ travaille _bien_"); 
    while(m.find()) { 
     System.out.println(">" + m.group()); 
    } 

या ज्यादातर गैर -alphabetic पात्रों पर तोड़ने के लिए विभाजन का उपयोग कर बराबर:

for (String s : "L'élève あゆみ travaille bien".split("\\P{IsAlphabetic}+")) 
     System.out.println(">" + s); 

दोनों मामलों में, उत्पादन होगा ठीक से tokenize शब्द ध्यान में रखते हुए फ्रेंच बल यहाँ एक उदाहरण है पात्रों और जापानी हिरागाना पात्रों - जैसे कि यह किसी भी यूनिकोड-समर्थित भाषा (supplementary multi-lingual plane समेत वर्तनी वाले शब्दों के लिए किया जाएगा)

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