2012-07-26 65 views
30

我有以下的代碼如何獲得正則表達式匹配的組值

String time = "14:35:59.99"; 
String timeRegex = "(([01][0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])(.([0-9]{1,3}))?"; 
String hours, minutes, seconds, milliSeconds; 
Pattern pattern = Pattern.compile(timeRegex); 
Matcher matcher = pattern.matcher(time); 
if (matcher.matches()) { 
    hours = matcher.replaceAll("$1"); 
    minutes = matcher.replaceAll("$4"); 
    seconds = matcher.replaceAll("$5"); 
    milliSeconds = matcher.replaceAll("$7"); 
} 

我越來越小時,分,秒,並使用matcher.replace方法和正則表達式組的反向引用毫秒線。有沒有更好的方法來獲得正則表達式組的價值。我試圖

hours = matcher.group(1); 

,但它拋出以下異常:

java.lang.IllegalStateException: No match found 
    at java.util.regex.Matcher.group(Matcher.java:477) 
    at com.abnamro.cil.test.TimeRegex.main(TimeRegex.java:70) 

我在這裏失去了一些東西?

+1

可以肯定的是,你仍然首先檢查'matcher.matches()== True',對吧? – 2012-07-26 09:36:02

回答

43

如果您避免撥打matcher.replaceAll,它可以正常工作。當您致電replaceAll時,它會忘記以前的任何比賽。

String time = "14:35:59.99"; 
String timeRegex = "([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(?:\\.([0-9]{1,3}))?"; 
Pattern pattern = Pattern.compile(timeRegex); 
Matcher matcher = pattern.matcher(time); 
if (matcher.matches()) { 
    String hours = matcher.group(1); 
    String minutes = matcher.group(2); 
    String seconds = matcher.group(3); 
    String miliSeconds = matcher.group(4); 
    System.out.println(hours + ", " + minutes + ", " + seconds + ", " + miliSeconds); 
} 

請注意,我還做了幾個改進你的正則表達式:

  • 我使用非捕獲組(?: ...)對你不感興趣的捕獲組。
  • 我改變了.,它匹配任何字符到\\.只匹配一個點。

看到它聯機工作:ideone

5

它的工作原理,如果你調用組函數之前使用matcher.find()

+0

我有一種情況'find'返回true,但組引發異常 – dopatraman 2017-07-19 20:39:43

相關問題