2009-05-27 5 views
37

मैं split() उपयोग कर रहा हूँ इस प्रारूप के बाद एक स्ट्रिंग * साथ अलग tokenize करने के लिए:Tokenizing त्रुटि: java.util.regex.PatternSyntaxException, झूलते metacharacter '*'

name*lastName*ID*school*age 
% 
name*lastName*ID*school*age 
% 
name*lastName*ID*school*age 

मैंने नामक एक फ़ाइल से पढ़ रहा हूँ "entrada.al" इस कोड का उपयोग:

static void leer() { 

    try { 
     String ruta="entrada.al"; 
     File myFile = new File (ruta); 
     FileReader fileReader = new FileReader(myFile); 

     BufferedReader reader = new BufferedReader(fileReader); 

     String line = null; 

     while ((line=reader.readLine())!=null){ 
      if (!(line.equals("%"))){ 
       String [] separado = line.split("*"); //SPLIT CALL 
       names.add(separado[0]); 
       lastNames.add(separado[1]); 
       ids.add(separado[2]); 
       ages.add(separado[3]); 
      } 
     } 

     reader.close(); 
    } 

और मैं इस अपवाद हो रही है:

Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0 *

मेरा अनुमान है कि मूल पाठ फ़ाइल पर उम्र के बाद * की कमी इस कारण है। मैं इसके आसपास कैसे हो सकता हूं?

उत्तर

118

नहीं, समस्या यह है कि * रेगेक्स में एक आरक्षित चरित्र है, इसलिए आपको इसे से बचने की आवश्यकता है।

String [] separado = line.split("\\*"); 

* का अर्थ है "पिछले शून्य या अभिव्यक्ति की अधिक" (Pattern Javadocs देखें), और आप इसे किसी भी पिछले अभिव्यक्ति देने के नहीं थे, अपने विभाजन अभिव्यक्ति अवैध बना रही है। यही कारण है कि त्रुटि PatternSyntaxException थी।

3

पहला जवाब इसे शामिल करता है।

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

आपने इसके लिए नहीं पूछा, लेकिन मैं ऊब गया हूं, इसलिए यहां एक उदाहरण है, उम्मीद है कि यह सहायक होगा।

यह हो सकता है हो सकता है वर्ग आप एक ही व्यक्ति का प्रतिनिधित्व करने के बारे में:

 

class Person { 
      public String firstName; 
      public String lastName; 
      public int id; 
      public int age; 

     public Person(String firstName, String lastName, int id, int age) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.id = id; 
     this.age = age; 
     } 
     // Add 'get' and 'set' method if you want to make the attributes private rather than public. 
} 
 

फिर, पार्स कोड आप मूल रूप से कुछ इस तरह दिखेगा पोस्ट के संस्करण: (यह उन्हें एक LinkedList में संग्रहीत करता है, यदि आप एक Hashtable की तरह कुछ और, आदि इस्तेमाल कर सकते हैं ..)

 

try 
{ 
    String ruta="entrada.al"; 
    BufferedReader reader = new BufferedReader(new FileReader(ruta)); 

    LinkedList<Person> list = new LinkedList<Person>(); 

    String line = null;   
    while ((line=reader.readLine())!=null) 
    { 
     if (!(line.equals("%"))) 
     { 
      StringTokenizer st = new StringTokenizer(line, "*"); 
      if (st.countTokens() == 4)   
       list.add(new Person(st.nextToken(), st.nextToken(), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken)));   
      else    
       // whatever you want to do to account for an invalid entry 
        // in your file. (not 4 '*' delimiters on a line). Or you 
        // could write the 'if' clause differently to account for it   
     } 
    } 
    reader.close(); 
} 
 
2

यह इसलिए क्योंकि * पिछले वर्ण के एक या अधिक आवृत्तियां सूचित करने के लिए एक metacharacter के रूप में प्रयोग किया जाता है। तो अगर मैं एम * लिखता हूं तो यह फाइलों के लिए एमएमएमएमएमएम ..... देखेंगे! यहां आप * एकमात्र चरित्र के रूप में उपयोग कर रहे हैं, इसलिए संकलक चरित्र को कई अवसरों को ढूंढने के लिए देख रहा है, इसलिए यह अपवाद फेंकता है। :)

5

मुझे regex = "?" के साथ समान समस्या थी। यह उन सभी विशेष पात्रों के लिए होता है जिनके पास रेगेक्स में कुछ अर्थ होता है। तो आपको अपने रेगेक्स के उपसर्ग के रूप में "\\" होना चाहिए।

String [] separado = line.split("\\*"); 
संबंधित मुद्दे