2014-09-15 4 views
1

У меня возникла проблема с поиском правильного регулярного выражения для чтения параметров файла ppm. Я не знаю, связано ли это с тем, что мое регулярное выражение неверно или я неправильно использую метод Pattern.compile, но получаю java.util.NoSuchElementException. Ниже моего регулярного выражения и кода вместе с ним. Он читает весь файл, так как мое регулярное выражение всегда возвращает null. Спасибо.Использование регулярного выражения для импорта измерений в файле ppm

package projet; 
import java.awt.Color; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.util.Scanner; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import java.util.regex.Pattern; 

public class Ppm extends File{ 
    private Dimensions d; 
    private Color[][] p; 
    public Ppm(String pathname) { 
     super(pathname); 
} 
public void read(){ 
    try { 
     Scanner s=new Scanner(new FileReader(this.getPath())); 
     while(s.findInLine(Pattern.compile("/^\\d* \\d*\\s$/")) == null && s.hasNext()){ 
      System.out.println(s.nextLine()); 
     } 
     s.close(); 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(Ppm.class.getName()).log(Level.SEVERE, null, ex); 
     System.out.println("Check filepath."); 
    } 
} 
} 

Вот мой пример файл: https://www.dropbox.com/s/z35dvi90zdfkws0/carte1.ppm?dl=0

EDIT:

Я попытался с согласованью, но он по-прежнему не работает, после скорректированного регулярного выражения. Вот мой код, он никогда не соответствует шаблону ...

public class Ppm extends File{ 
    private Dimensions d; 
    private Color[][] p; 
    public Ppm(String pathname) { 
     super(pathname); 
     d=new Dimensions(0, 0); 
    } 
    public void read(){ 
     try { 
      Scanner s=new Scanner(new FileReader(this.getPath())); 
      Pattern p=Pattern.compile("^\\d+ \\d+\\s$"); 
      Matcher m; 
      while(s.hasNext()){ 
       m=p.matcher(s.nextLine()); 
       if(m.matches()){ 
        System.out.println("Found"); 
       } 
      } 
      //System.out.println("W : "+d.getWidth()+" H: "+d.getHeight()); 
     } catch (FileNotFoundException ex) { 
      Logger.getLogger(Ppm.class.getName()).log(Level.SEVERE, null, ex); 
      System.out.println("Check filepath."); 
     } 
    } 
} 
+0

Вы проверяете 'hasNext()' и печатаете 'nextLine?' – TheLostMind

+0

Это наверняка проблема со Сканером. Кроме того, нет необходимости создавать объект Pattern для каждой итерации, просто создайте его один раз и используйте scanner.useDelimiter (yourPattern). Можете ли вы вставить фрагмент образца, потому что я открыл файл, который вы разместили, и в нем содержится номер лота. – sol4me

+0

Вот образец, который я использую. Сократите его, если хотите меньший фрагмент, но он базовый. Я действительно не понимаю, почему мой код не работает ... – Lapsusone

ответ

0

Ваше регулярное выражение никогда не будет соответствовать.

Pattern.compile("/^\\d* \\d*\\s$/") 

запрашивает текст имеет косую черту до того начала строки и после конца строки. В отличие от PHP, Java не использует разделители регулярных выражений. Попробуйте

Pattern.compile("^\\d* \\d*\\s$") 

(и быть в курсе, что это также соответствует строкам как " 1 " или "1 " или даже " ").

+0

Спасибо. Мне нужно изменить «*» на «+» для сканирования двух чисел, следующих друг за другом? Также я заменил регулярное выражение, но оно не находит строку измерений и печатает все. – Lapsusone