2014-10-20 4 views
2

У меня есть текстовый файл, содержащий несколько статей, которые мне нужно проанализировать.Regex в сканере находит только первое совпадение

Мне нужно получить каждое слово в каждой статье, за исключением полных остановок, запятых и т. Д. Статьи разделены двумя строками, и я пытаюсь использовать шаблон регулярных выражений, чтобы найти эти точки.

Пример документа выглядит следующим образом:

.I 1 
.W 
this is article one.   
.I 2 
.W 
this is article two.     
.I 3 
.W 
this is article three. 

ниже код, кажется, находит первое вхождение .I 1 и добавить все последующие слова, но как только он попадает в следующий сепаратор он добавляет его как слово вместо того, чтобы пропустить его.

Scanner scanner = new Scanner(document); 
scanner.useDelimiter("[^\\w']+"); 
String separator; 
while (scanner.hasNext()){ 
    separator = scanner.findInLine(Pattern.compile(".I \\d")); 
    if (separator!= null) { 
     System.out.println("Found: " + separator); 
     scanner.nextLine(); 
     scanner.nextLine(); 
    } 
    list.add(scanner.next()); 
} 
scanner.close(); 

Если возможно, я также хотел бы иметь возможность захватить фактический номер изделия, который является числом, прикрепленным к каждому разделителю.

Что не так в моем коде?

ответ

1

Проблема заключается в том, что, так как вы говорите Scanner использовать все, кроме символов слова и клещей в качестве разделителей, точка перед I потребляется scanner.next() каждый раз она собирается придумать в вашем findInLine поиска.

Вы можете исправить это, читая входной линией, а не читать его слова, как это:

list.add(scanner.nextLine()); 

Чтобы получить номер статьи, синтаксический разделитель, начиная с символа 3:

int num = Integer.valueOf(separator.substring(3)); 

Вот демо, который считывает данные из стандартного ввода:

Scanner scanner = new Scanner(System.in); 
scanner.useDelimiter("[^\\w']+"); 
String separator; 
Pattern rx = Pattern.compile(".I \\d"); 
while (scanner.hasNext()){ 
    separator = scanner.findInLine(rx); 
    if (separator!= null) { 
     int num = Integer.valueOf(separator.substring(3)); 
     System.out.println("Found: " + separator+", article number: "+num); 
     scanner.nextLine(); 
     scanner.nextLine(); 
    } 
    System.out.println(scanner.nextLine()); 
} 
scanner.close(); 

Demo.

+0

Спасибо. В итоге я использовал вариант этого, не используя этот разделитель со сканером. Как только у меня была каждая строка, я использовал String.split с оригинальным регулярным выражением для получения каждого отдельного слова. – karoma

Смежные вопросы