2012-03-17 11 views
5

मैं स्ट्रिंग को ईएडीजीबीई या डीएडीएफ # एडी के रूप में अलग-अलग तारों में विभाजित करना चाहता हूं, प्रत्येक में एक अक्षर या एक अक्षर और # चिह्न शामिल है। क्या ब्रूट-फोर्स प्रकार के दृष्टिकोण के साथ स्ट्रिंग के माध्यम से फिर से शुरू करने से कहीं अधिक सुरुचिपूर्ण तरीका है?जावा में एक गैर-सीमांकित स्ट्रिंग को विभाजित करने का एक अच्छा तरीका क्या है?

स्ट्रिंग.split स्पष्ट रूप से डिलीमीटर पर निर्भर करता है, जिसे तब छोड़ दिया जाता है, जो मुझे बहुत अधिक उपयोग नहीं करता है - कुछ मिनटों के लिए मैंने सोचा कि split("[a-gA-G]#?"); काम करने जा रहा था, लेकिन नहीं, इससे मदद नहीं मिलती सभी - मैं लगभग कि के विपरीत चाहते हैं ...

+0

क्या आप एक स्ट्रिंग का उदाहरण दे सकते हैं जिसे आप विभाजित करना चाहते हैं? – chandsie

+0

मुझे डर है कि आपको ब्रूट-फोर्स विधि – mac

+0

के लिए जाना होगा यह छोटा है। क्रूर बल के लिए जाओ। रेगेक्स की जटिलता और अवलोकन को न जोड़ें। –

उत्तर

3

ब्रूट बल दोनों कोड और प्रदर्शन के मामले में, आपका सबसे अच्छा विकल्प होने की संभावना है।

वैकल्पिक रूप से, आप एक Matcher

Pattern p = Pattern.compile("[a-gA-G]#?"); 
Matcher m = p.march(inputString); 
List<String> matches = new ArrayList<String>(); 
while(m.find()) 
    matches.add(m.group()); 
+0

आह, बहुत अच्छा - मेरे गुगलिंग में से कोई भी Matchers के बारे में कुछ भी नहीं बदल गया! उसके लिए धन्यवाद। :) – Oolong

1

इस्तेमाल कर सकते हैं आप पैटर्न में परिवर्तन forsee यदि आप उपयोग कर सकते हैं:

String s = "DADF#AD"; 
    Pattern p = Pattern.compile("([a-gA-G]#?)"); 
    Matcher matcher = p.matcher(s); 
    while (matcher.find()) { 
     System.out.println(matcher.group()); 
    } 
1

अग्रदर्शी और lookbehind का उपयोग करते हुए काम करता है: String regex = "(?<=.)(?=\\w#?)";

जैसे,

import java.util.Arrays; 

public class Foo { 
    public static void main(String[] args) { 
     String[] tests = {"EADGBE", "DADF#AD"}; 
     String regex = "(?<=.)(?=\\w#?)"; 
     for (String test : tests) { 
     System.out.println(Arrays.toString(test.split(regex))); 
     } 
    } 
} 

रिटर्न:

[ई, ए, डी, जी, बी, ई]
[डी, ए, डी, एफ #, ए, डी]

+0

'स्ट्रिंग regex =" (? = (?! ^) \\ w #?) "; ', वहां आप जाते हैं। –

+0

@refp: यह काम करने के लिए भी दिखता है - लाइन को कैद होने से रोकना बंद कर देता है। Slick और धन्यवाद! –

+0

आह ... मुझे नहीं पता था कि यह एक विकल्प था! शायद तकनीक के सबसे मानव-अनुकूल नहीं - या शायद मैं वास्तव में नौसिखिया-अनुकूल का मतलब रखता हूं - लेकिन यह जानना निश्चित रूप से अच्छा है कि जावा में रेगेक्सप्स के साथ ऐसा कुछ है जो आप कर सकते हैं। धन्यवाद! – Oolong

0

कैसे उस के बारे में: सीमांकक, तो विभाजन जोड़ें:

यह तरीकों कहते हैं सीमांकक

private static String delimit(String in) { 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < in.length()-1; i++) { 
    sb.append(in.charAt(i)); 
    if (in.charAt(i+1) != '#') 
     sb.append(';'); 
    } 
    return sb.toString(); 
} 

इसका इस्तेमाल करने के लिए:

String[] notes = delimit("DADF#AD").split(";"); 
+0

एक अनावश्यक इंटरमीडिएट स्ट्रिंग बनाने के बजाय टोकन की सूची उत्पन्न करने के लिए लूप का उपयोग क्यों न करें? – Dunes

+0

@ ड्यून्स मैंने पहले से ही उन मानक समाधानों में दर्जनों पोस्ट किए हैं - बस कुछ अलग करना चाहते थे;) –

+0

हे! मुझे लगता है कि काम करेगा, हाँ। मैंने delimiters डालने के बारे में आश्चर्यचकित किया, लेकिन मुझे लगा कि एक आसान तरीका होना चाहिए ... जो, जैसा कि अन्य उपयोगकर्ताओं ने इंगित किया है, वहाँ है! लेकिन किसी भी मामले में धन्यवाद, विकल्प के बारे में जागरूक होना स्वस्थ है ... – Oolong

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

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