2013-09-26 21 views
5

Sto analizzando un file e contiene voci in base al tempo. formato è simile:Corrispondenza espressione regolare Java per hh: mm: ss in stringa

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

Ecco quello che voglio è quello di estrarre il valore del tempo dalla linea di corda

Ho cercato molti collegamenti e non sono riuscito a scoprire la cosa quello che voglio, alla fine ho scritto questo codice.

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; 

Di seguito si riporta il ciclo in cui applico la logica

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; 
      } 
    } 

che voglio quando "matcher.find()" dà il vero mi [00:02:10] ritorna in prima iterazione e [00 : 04: 50] in 2a iterazioni.

+1

Hai pensato di usare [SimpleDateFormat] (http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html) invece di scrivere il proprio regex? –

+0

No signore, non l'ho fatto, Grazie per aver condiviso il tuo codice valido – DareDevil

risposta

3

sembra un modello inutilmente complicato .... perché non solo (se si sta facendo l'elaborazione riga per riga):

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

se si sta facendo multi-linea di lavorazione che si vuole utilizzare :

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

Ecco alcuni esempi di codice e di uscita:

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)); 
    }   
} 

uscite

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

Che dire di input come '99: 99: 99'? La tua espressione regolare corrisponde ai valori non temporali :(ps e perché raggruppare la corrispondenza? Sapevi che puoi semplicemente ottenere il gruppo zero? – Bohemian

2

Non utilizzare regex per questo, utilizzare . Questo ha due vantaggi enormi

  1. Il codice in SimpleDateFormat è testato e robusto
  2. Il SimpleDateFormat convaliderà per assicurarsi di avere i numeri in tempo reale

Questo sarebbe simile a questa:

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)); 
    } 
} 

Uscita:

0 
2 
10 
0 
4 
50 

Dal javadoc for DateFormat.parse:

analizza il testo a partire dall'inizio della stringa data per la produzione di una data. Il metodo non può utilizzare l'intero testo della stringa specificata.

Così il SimpleDateFormat analizzerà il String fino a quando si legge l'intero modello specificato poi si ferma.

+0

sembra come dovrebbe essere '(" KK: mm: ss ")' – Anirudha

+0

@Anirudh, sei giusto - non dovrebbe essere 'hh', ma penso che dovrebbe essere' 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

Ho fatto in questo modo.

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

Ho visto sopra i supporti di codice per i formati 12H e 24H –

Problemi correlati