2010-11-01 13 views
5

मैं जावा
में निम्न कार्य करने का प्रयास कर रहा हूं "https://stackoverflow.com/a/b/c" जैसे निर्देशिका पथ दें, मैं ["a", "b", "c"] के रूप में स्ट्रिंग की सरणी प्राप्त करना चाहता हूं। कोड निम्नानुसार है:जावा - निर्देशिका पथों को विभाजित करने के लिए नियमित अभिव्यक्ति

private static final String DIRECTORY_PATH_SEPARATOR = "/"; 
    Iterator iter = testPaths.iterator(); 

      String[] directories; 

     while(iter.hasNext()) { 

      directories = ((String) iter.next()).split(DIRECTORY_PATH_SEPARATOR); 
     } 

लेकिन मुझे सरणी के रूप में जो भी मिलता है वह भी अंतरिक्ष है। मैं उन सभी तारों को length>0 के साथ प्राप्त करना चाहता हूं।
मैं यह कैसे कर सकता हूं ??

उत्तर

4

एकमात्र जगह जिसे आप खाली स्ट्रिंग (वैध पथ में) प्राप्त करेंगे, वह पहला आइटम होगा यदि पथ विभाजक के साथ शुरू हुआ था। यदि यह अग्रणी विभाजक था, तो इसके बिना पथ पर विभाजित।

String path = "https://stackoverflow.com/a/b/c"; 
String[] directories = path.substring(1).split(DIRECTORY_PATH_SEPARATOR); 
// { "a", "b", "c" } 

OmnipotentEntity द्वारा बताया गया है, मेरी धारणा वैध रास्तों के बारे में गलत था। split() का उपयोग करते समय आपको अन्यथा सरणी के माध्यम से जाना होगा और nonempty तारों को रखना होगा।

public static List<String> splitFilePath(final File f){ 
    if(f == null){ 
     throw new NullPointerException(); 
    } 
    final List<String> result = new ArrayList<String>(); 
    File temp = f.getAbsoluteFile(); 
    while(temp != null){ 
     result.add(0, temp.getName()); 
     temp = temp.getParentFile(); 
    } 
    return result; 
} 

:

String path = "https://stackoverflow.com/a/b////c"; 
ArrayList<String> directories = new ArrayList<String>(); 
Pattern regex = Pattern.compile("[^" + DIRECTORY_PATH_SEPARATOR + "]+"); 
Matcher matcher = regex.matcher(path); 
while (matcher.find()) 
    directories.add(matcher.group()); 
+0

वास्तव में सत्य नहीं है: "/ // // b ////// c" भी एक वैध पथ है। – OmnipotentEntity

+0

@ ओमनी: क्या यह वास्तव में एक वैध पथ है? यदि हां, तो मुझे संशोधन करना होगा। –

+0

सच के लिए। खुद को एक खोल में आज़माएं। :) शायद करने के लिए सबसे अच्छी बात यह है कि इसे पूरा करने के बाद सरणी चलें और खाली तारों को खत्म कर दें। – OmnipotentEntity

0

यहाँ एक और अधिक विश्वसनीय गैर regex संस्करण फाइल सिस्टम दिनचर्या का उपयोग करता है है:

String path = "https://stackoverflow.com/a/b////c"; 
String[] split = path.split(DIRECTORY_PATH_SEPARATOR); 
ArrayList<String> directories = new ArrayList<String>(split.length); 
for (String dir : split) 
    if (dir.length() > 0) 
     directories.add(dir); 

एक वैकल्पिक गैर विभाजक वर्णों का मिलान करने वास्तविक रेगुलर एक्सप्रेशन का उपयोग करने के लिए है टेस्ट कोड:

public static void main(final String[] args){ 
    final File f = new File("foo/bar/phleem.txt"); 
    final List<String> parts = splitFilePath(f); 
    System.out.println(parts); 
} 

आउटपुट:

[, घर, seanizer, परियोजनाओं, ग्रहण, helios2, stackfiddler, foo, बार, phleem.txt]

मैं एक सूची लौट क्योंकि यह अधिक प्रयोग करने योग्य है

List<String> parts = splitFilePath(f); 
String[] partsAsArray = parts.toArray(new String[parts.size()]); 
1

:, लेकिन वहाँ से किसी भी विधि को बदलने एक सरणी वापस जाने के लिए या बाहर इस का उपयोग करने से परिणाम परिवर्तित आप को रोकने के लिए कुछ भी नहीं है String.split(String) विधि बहुत लचीला नहीं है, और इसके परिणाम आश्चर्यजनक हो सकते हैं (उदाहरण के लिए चुपचाप खाली पीछे तारों को छोड़कर)। मैं अपने प्रोजेक्ट के लिए Guava libraries (जावा के लिए गूगल कोर पुस्तकालय) का उपयोग कर रहा है, और वह है कि एक बहुत ही पठनीय और उम्मीद के मुताबिक रास्ते में आप क्या चाहते हैं एक बहुत ही अच्छा Splitter उपयोगिता शामिल हैं:

String path = "https://stackoverflow.com/a/b///c///"; 
Iterable<String> directories = Splitter 
    .on(DIRECTORY_PATH_SEPARATOR) 
    .omitEmptyStrings() 
    .split(path); 

है कि आप एक देता है iterable आप सीधे इस तरह पाश के लिए एक में उपयोग करने वाले कर सकते हैं:

for(String directory : directories) { 
    System.out.println(directory); 
} 

उस मामले में तो यह और भी निर्देशिका स्टोर करने के लिए एक मध्यवर्ती वस्तु का निर्माण नहीं करता है, लेकिन यह मक्खी पर उन्हें पैदा करता है।

आप निर्देशिका सूची की जरूरत है, तो आप एक ArrayList या इस तरह सरणी में iterable कॉपी कर सकते हैं:

List<String> dirList = Lists.newArrayList(directories); 
String[] dirArray = Iterables.toArray(directories, String.class); 

एक बंद नोट के रूप में: पोर्टेबल कोड लिखने के लिए आपको File.separator के बजाय का उपयोग करना चाहिए DIRECTORY_PATH_SEPARATOR

2

आपको इसके लिए फ़ाइल क्लास का उपयोग करना चाहिए, रेगेक्स नहीं।

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