2013-09-26 59 views
5

我正在解析一個文件,它有基於時間的條目。格式是這樣的:Java正則表達式匹配hh:mm:ss在字符串中

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()」給出了正確返回我[0時02分10秒]在第一次迭代和[00 :04:50]在第二次迭代。

+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和爲什麼分組匹配?你知道你可以得到組0嗎? – Bohemian

2

不要使用正則表達式,使用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

@Anirudh,你是正確 - 它不應該是'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格式 –