2013-09-26 3 views
5

Я анализирую файл и в нем есть записи, основанные на времени. Формат как:Java Регулярное выражение Соответствие для hh: mm: ss in String

00:02:10-XYZ:Count=10 
00:04:50-LMK:Count=3 

Вот что я хочу, чтобы извлечь значение времени из строки строки

Я искал много ссылок и не мог узнать вещь, что я хочу, в конце концов я написал это код.

Pattern pattern = Pattern.compile("((?i)[0-9]{1,2}:??[0-9]{0,2}:??[0-9]{0,2})"); //(?i)[0-9]{1,2}:??[0-9]{0,2}:??[0-9]{0,2} //\\d{1,2}:\\d{1,2}:\\d{1,2} 
    Matcher matcher; 
    List<String> listMatches; 

Ниже цикл, где я применяю логику

for(int x = 0; x < file_content.size(); x++) 
    { 
      matcher= pattern.matcher(file_content.get(x)); 
      listMatches = new ArrayList<String>(); 
      while(matcher.find()) 
      { 
       listMatches.add(matcher.group(1)); 
       break; 
      } 
    } 

Я хочу, когда "Matcher.find()" дает верно возвращает меня [00:02:10] в первой итерации и [00 : 04: 50] в 2-й итерации.

+1

вы рассмотрели с помощью [SimpleDateFormat] (http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html) вместо того, чтобы писать свои собственные регулярные выражения? –

+0

Нет, сэр, я этого не сделал, спасибо, что поделился своим ценным кодом – DareDevil

ответ

3

Кажется излишне сложный рисунок .... почему бы не просто (если вы делаете линию за линией обработки):

"^(\\d\\d:\\d\\d:\\d\\d)" 

Если вы делаете многострочные обработки вы хотите использовать :

"(?m)^(\\d\\d:\\d\\d:\\d\\d)" 

Вот несколько примеров кода и выход:

public static void main(String[] args) { 
    final Pattern pattern = Pattern.compile("(?m)^(\\d\\d:\\d\\d:\\d\\d)"); 
    final Matcher matcher= pattern.matcher("00:02:10-XYZ:Count=10\n00:04:50-LMK:Count=3"); 
    while(matcher.find()) 
    { 
     System.out.printf("[%s]\n", matcher.group(1)); 
    }   
} 

выходы

[00:02:10] 
[00:04:50] 
+1

Как насчет ввода как '99: 99: 99'? Ваше регулярное выражение соответствует не-временным значениям :(ps и почему группировать матч? Знаете ли вы, что можете просто получить нуль группы? – Bohemian

2

Не используйте regex для этого, используйте SimpleDateFormat. Это имеет два огромного преимущество

  1. Код в SimpleDateFormat тестируется и надежный
  2. SimpleDateFormat будет проверять, чтобы убедиться, что у вас есть реальные цифры времени

Это будет выглядеть примерно так:

public static void main(String[] args) throws Exception { 
    final String s = "00:02:10-XYZ:Count=10\n" 
      + "00:04:50-LMK:Count=3"; 
    final Scanner sc = new Scanner(s); 
    final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 
    while(sc.hasNextLine()) { 
     final String line = sc.nextLine(); 
     final Date date = dateFormat.parse(line); 
     final Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(date); 
     System.out.println(calendar.get(Calendar.HOUR)); 
     System.out.println(calendar.get(Calendar.MINUTE)); 
     System.out.println(calendar.get(Calendar.SECOND)); 
    } 
} 

Выход:

0 
2 
10 
0 
4 
50 

От javadoc for DateFormat.parse:

Анализирует текст с начала данной строки для получения даты. Метод может не использовать весь текст данной строки.

Так SimpleDateFormat будет разбирать String, пока он не читает весь шаблон указан, то останавливается.

+0

Кажется, что это должно быть '(« KK: mm: ss »)' – Anirudha

+0

@ Анируд, вы правильно - это не должно быть 'hh', но я думаю, что это должно быть' HH'. –

3
SimpleDateFormat dateFormat = new SimpleDateFormat("KK:mm:ss");  
Pattern pattern = Pattern.compile("\\d+:\\d+:\\d+"); 
Matcher matcher; 
List<Date> listMatches = new ArrayList<Date>(); 
for(int x = 0; x < file_content.size(); x++) 
{ 
    matcher= pattern.matcher(file_content.get(x)); 
    while(matcher.find()) 
    { 
     Date temp=null; 
     try{temp=dateFormat.parse(matcher.group(0));}catch(ParseException p){} 
     if(temp!=null) 
     listMatches.add(temp); 
    } 
} 
4

Я сделал таким образом.

00:02:10-XYZ:Count=10 
00:04:50-LMK:Count=3 

Pattern pattern = Pattern.compile("([2][0-3]|[0-1][0-9]|[1-9]):[0-5][0-9]:([0-5][0-9]|[6][0])"); 
//File Beginning Time 
for(int x = 0; x < file_content.size(); x++) 
    { 
     matcher= pattern.matcher(file_content.get(x)); 
     ListMatches = new ArrayList<String>(); 
     if(matcher.find()) 
      { 
       start_time = matcher.group(); 
       break; 
      }     
    } 
//File End Time 
for(int x = file_content.size()-1; x > 0 ; x--) 
     { 
      matcher= pattern.matcher(file_content.get(x)); 
      listMatches = new ArrayList<String>(); 
      if(matcher.find()) 
      { 
       end_time = matcher.group(); 
       break; 
      }     
     } 
+1

Я видел выше поддержки кода для форматов 12H и 24H –

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