2009-05-27 4 views
37

나는이 형식 다음 *로 구분 된 문자열 토큰 화하는 split()을 사용하고 있습니다 :토큰 화 오류 : java.util.regex.PatternSyntaxException, 메타 문자를 매달려 '*'

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

I라는 이름의 파일이 읽고 있어요을 "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 *

,691을

원래 텍스트 파일에서 나이가 지난 후에 *이 부족하다는 것이 내 생각 인 것 같습니다. 어떻게해야합니까?

답변

118

아니요, 문제는 *이 정규 표현식에서 예약 된 문자이므로 이스케이프해야합니다.

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

*는 "제로 또는 이전 표현보다"합니다 (Pattern Javadocs 참조)를 의미하며, 당신은 당신의 분할 식을 불법 제작, 그것을 이전 식을 제공하지 않았다. 이것이 오류가 PatternSyntaxException 인 이유입니다.

3

첫 번째 답변에서 다룹니다.

어딘가에있는 줄을 추측하면 다른 클래스/구조에 정보를 저장할 수 있습니다. 이 경우 결과가 split() 메소드의 배열로 들어가는 것을 원하지 않을 것입니다.

당신은 그것을 요구하지 않았지만 지루합니다. 그래서 여기에 예가 있습니다. 도움이되기를 바랍니다.

이 수도있을 당신이 한 사람을 표현하기 위해 작성하는 클래스 :

 

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의에 저장합니다, 당신은 해시 테이블과 같은 다른 것 등을 사용할 수 있습니다 ..)

 

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

* 이전 문자의 하나 또는 그 이상의 발행 수를 의미하는 메타 문자로 사용하기 때문입니다. 그래서 M *을 쓰면 MMMMM ..... 파일을 찾을 것입니다! 여기에서는 *를 유일한 문자로 사용하므로 컴파일러가 문자를 여러 번 찾아서 예외를 throw합니다. :)

5

regex = "?"과 비슷한 문제가있었습니다. 정규식에서 어떤 의미를 갖는 모든 특수 문자에 대해 발생합니다. 따라서 "\\"을 정규식의 접두사로 사용해야합니다.

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