2014-05-07 15 views
16

मैं "aaaabbbccccaaddddcfggghhhh" स्ट्रिंग को "aaaa", "bbb", "cccc" में विभाजित करना चाहता हूं। "एए", "डीडीडीडी", "सी", "एफ" और इसी तरह।दोहराए गए अक्षरों में स्ट्रिंग स्ट्रिंग

String[] arr = "aaaabbbccccaaddddcfggghhhh".split("(.)(?!\\1)"); 

लेकिन यह दूर एक चरित्र खाती है, इसलिए ऊपर नियमित अभिव्यक्ति के साथ मैं "aaa" मिल जब मैं यह पहली स्ट्रिंग के रूप में "aaaa" होना चाहता हूँ:

मैं इस कोशिश की।

मैं इसे कैसे प्राप्त करूं?

+0

क्या आप इसे केवल रेगेक्स का उपयोग करना चाहते हैं? – Tofandel

+1

@ Adri1du40: मैं अन्य विकल्पों के लिए खुला हूं लेकिन लूप का उपयोग नहीं करना चाहता हूं। – Lokesh

+0

इस प्रश्न को जांचें: http://stackoverflow.com/questions/15101577/split-string-when-character-changes-possible-regex-solution – Tofandel

उत्तर

19

इस प्रयास करें हम एक ही वर्ण के समूह में स्ट्रिंग विभाजित करना चाहते हैं, तो हम यह पता लगाने की जरूरत है प्रत्येक समूह के बीच "सीमा"। मैं पिछले चार को चुनने के लिए पॉजिटिव लुक-बैक के लिए जावा के सिंटैक्स का उपयोग कर रहा हूं और उसके बाद बैक रेफरेंस के साथ एक ऋणात्मक रूप से आगे देख रहा हूं ताकि यह सत्यापित किया जा सके कि अगला चार पिछले जैसा नहीं है। वास्तव में कोई पात्र नहीं खाया गया था, क्योंकि केवल दो दिखने वाले दावों का उपयोग किया जाता था (यानी, नियमित विस्तार शून्य-चौड़ाई है)।

+0

आपका समाधान पूरी तरह से काम करता है। क्या आप कृपया इस रेगेक्स को समझा सकते हैं। यह काम किस प्रकार करता है। – Lokesh

+0

@ लोकेश आपको यह मिला –

5

एक नजर में कैप्चरिंग के बारे में क्या?

(?<=(.))(?!\1|$) 

एक जावा स्ट्रिंग के रूप में:

String str = "aaaabbbccccaaddddcfggghhhh"; 
String[] out = str.split("(?<=(.))(?!\\1)"); 

System.out.println(Arrays.toString(out)); 
=> [aaaa, bbb, cccc, aa, dddd, c, f, ggg, hhhh] 

स्पष्टीकरण::

(?<=(.))(?!\\1|$) 
+1

@TJCrowder [यहां ठीक लगता है] (http://ideone.com/ghhXhg)। आपको ऐसा क्यों लगता है कि यह काम नहीं कर रहा है? – Reimeus

+2

@ रीमेमस: क्योंकि मैंने भागने के बिना इसे कॉपी और पेस्ट किया था। मैं ** वास्तव में ** चाहता हूं कि जावा में रेगेक्स शब्दशः हों। :-) –

1

यहां मैं प्रत्येक चरित्र ले रहा हूं और यदि लूप i.e स्ट्रिंग में दो स्थितियों की जांच कर रहा है, तो स्ट्रिंग लंबाई से अधिक नहीं हो सकती है और यदि अगला चरित्र पहले वर्ण के बराबर नहीं है तो लूप के लिए अन्य पंक्ति लें और इसे प्रिंट करें।

for (int i = 0; i < arr.length; i++) { 
    char chr= arr[i]; 
    System.out.print(chr); 
    if (i + 1 < arr.length && arr[i + 1] != chr) { 
     System.out.print(" \n"); 
    } 
} 
+0

एक गुणवत्ता के उत्तर के लिए, @ शिवा क्या आप इस शब्द को पूरा करने के लिए कुछ स्पष्टीकरण जोड़ सकते हैं कि लेखक क्या हासिल करने की कोशिश कर रहा है? – pczeus

+0

मुझे उत्तर @ pczeus में सुधार किया गया था –

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