2016-11-04 5 views
1

надеюсь, что это коротко и на вопрос .. В приведенной ниже программе я успешно извлек ВСЕ данные из документа-ноты под названием «pad.txt», который состоит из 3 наборов, выровненных по вертикали с «ID», за которым следует «Имя», а затем «Дата регистрации», этот шаблон согласован.Извлечение всех DATES из .txt-файла

блокнота документ состоит только из этого: сделал: 1 Имя: Bob Дата регистрации: 01/12/2014 ID: 2 Имя: Jim Дата регистрации: 8/21/1993 ID: 3 Имя: Steve Дата регистрации: 6/07/2016

Я также определил регулярное выражение, которое принимает приемлемый формат даты: 1-2 цифр, слэш, 1-2 цифры еще раз, слэш, затем 2 для четыре цифры для даты YEAR. В начале этого я указал символ wild card "." < - точка с жадным квантором «» звездами, чтобы сказать, любое количество любых символов до даты принимается, а также после даты я также уточнил

Мою главной цели с «.» этот код, чтобы выделить только все ДАТ в файле pad.txt, и сохранять их в виде строки или что-то ..

общественный класс Main {

public static void main(String args[]) throws Exception{ 

     StringBuilder builder = new StringBuilder(); 
    FileReader reader = new FileReader(new File("pad.txt")); 

//  Define valid date format via regex 
    String dateRegex = ".* (\\d{1,2})/(\\d{1,2})/(\\d{2,4}) .* "; 

     int fileContent = 0; 
//  iterate through entire notepad doc, until = 0 AKA (finished searching doc) 
    while((fileContent = reader.read()) !=-1){ 

     builder.append((char)fileContent); 

     }//encapsulating loop 
    reader.close(); 

    String extracted = builder.toString(); 
    System.out.println("Extracted: " + extracted); 
    System.out.println(); 

     Matcher m = null; 
//   Validate that file contents conform with 'dateRegex' 
     m = Pattern.compile(dateRegex).matcher(extracted);  
     if(m.find()){ 
     System.out.println("Entire group : " + m.group()); 
     } 
    } 
    } 

к сожалению, m.group() ; Outprint only возвращается: «Целая группа: 6/07/2016» Как сказано, моя цель - извлечь ВСЕ даты, но я не могу играть со всеми датами, если вызов .matcher ТОЛЬКО ловит «Целый group: 6/07/2016 « На мой взгляд, я говорю, что ЛЮБОЙ характер ЛЮБОЙ суммы разрешен до и после даты, поэтому он прокручивается до самого низа и находит ТОЛЬКО последнюю дату, как я определяю регулярное выражение так, чтобы он вытаскивает ВСЕ даты, а не только самую ПОСЛЕДНЮЮ, и почему она только тянет последнюю?

Я пытался упорно с этим и не могу понять, как ..

Заранее спасибо

ответ

1

Ну, это относительно легко. Вы не можете писать регулярное выражение, которое соответствует всем датам одновременно, но вы можете использовать совпадение, поскольку оно предназначалось для использования, т. Е. find() возвращает true так же часто, как и другое совпадение. Итак, вам нужно изменить ваше регулярное выражение и удалить .* с обоих концов. Тогда вы можете просто сделать это:

StringBuilder dateListBuilder = new Stringbuilder(); 
while(m.find()){ 
    dateListBuilder.append(m.group()); 
} 
System.out.println(dateListBuilder.toString()); 
+0

AH! Это было так просто, я знал, что моя реализация .group была немного неправильной, спасибо! С этим я сделал еще большие успехи в понимании регулярных выражений :) – Keith