2016-09-12 27 views
0

下面的代碼片斷試圖提取字符串的小時,分​​鍾和秒。 例如: 「PT5M30S」
「PT1H13M59S」使用Java中的正則表達式解析時間

我得到一個NullPointerException在此行中(組= NULL):INT數=新的整數(group.substring(0,group.length() - 1) );

// Create a Pattern object 
    Pattern pattern = Pattern.compile("PT(\\d+H)?(\\d+M)?(\\d+S)?"); 
    // Now create matcher object. 
    Matcher matcher = pattern.matcher(duracaoStr); 

    int hour = 0; 
    int minute = 0; 
    int second = 0; 
    if(matcher.matches()){ 
     for(int i = 1; i<=matcher.groupCount();i++){ 
      String group = matcher.group(i); 
      int number = new Integer(group.substring(0, group.length()-1)); 
      if(matcher.group(i).endsWith("H")){ 
       hour = number; 
      } else if(matcher.group(i).endsWith("M")){ 
       minute = number; 
      } else if(matcher.group(i).endsWith("S")){ 
       second = number; 
      } 
     } 
    } 

回答

1

只要嘗試編譯String的個人,一個接一個的代碼。

然後,您會注意到這個計劃成功編譯第二個字符串即PT1H13M59S而它給NullPointerException第一個字符串,即PT5M30S

您從您的第一個String PT5M30S得到這個NullPointerException因爲這個字符串沒有按't包含group 1。請注意,有一個爲你的第一個字符串沒有HourPT5M30S


看到這個Demo

正則表達式

PT(\d+H)?(\d+M)?(\d+S)? 

輸入

PT5M30S 
PT1H13M59S 

匹配更多信息

MATCH 1 
2. [2-4] `5M` 
3. [4-7] `30S` 
MATCH 2 
1. [10-12] `1H` 
2. [12-15] `13M` 
3. [15-18] `59S` 

請注意,在對第1場的第一個字符串,沒有輸出組1


所以,你應該做的是,你應該進行適當的驗證。只需將您的代碼放在NullPointerExceptiontrycatch區塊中,並且如果發生NullPointerException,則將默認值賦予所有變量。

例如:,

import java.util.regex.*; 

public class HelloWorld { 
    public static void main(String[] args) { 
     // Create a Pattern object 
     Pattern pattern = Pattern.compile("PT(\\d+H)?(\\d+M)?(\\d+S)?"); 
     // Now create matcher object. 
     Matcher matcher = pattern.matcher("PT5M30S"); 

     int hour = 0; 
     int minute = 0; 
     int second = 0; 

     if (matcher.matches()) { 
      for (int i = 1; i <= matcher.groupCount(); i++) { 
       try { 
        String group = matcher.group(i); 
        int number = new Integer(group.substring(0, group.length() - 1)); 
        if (matcher.group(i).endsWith("H")) { 
         hour = number; 
        } else if (matcher.group(i).endsWith("M")) { 
         minute = number; 
        } else if (matcher.group(i).endsWith("S")) { 
         second = number; 
        } 
       } catch (java.lang.NullPointerException e) { 
        if (i == 1) { 
         hour = 0; 
        } else if (i == 2) { 
         minute = 0; 
        } else if (i == 3) { 
         second = 0; 
        } 
       } 
      } 
     } 
    } 
} 
1

@以上RD的解決方案是充分,以及解答(請選擇自己)。只是作爲一種替代我工作的一個解決方案在這裏也之前,我意識到這是正確的回答: https://github.com/davethomas11/stackoverflow_Q_39443620

// Create a Pattern object 
    Pattern pattern = Pattern.compile("PT(\\d+H)?(\\d+M)?(\\d+S)?"); 
    // Now create matcher object. 
    Matcher matcher = pattern.matcher(duracaoStr); 

    int hour = 0; 
    int minute = 0; 
    int second = 0; 
    if(matcher.matches()){ 
     for(int i = 1; i<=matcher.groupCount();i++){ 
      String group = matcher.group(i); 

      //Group will be null if not in pattern 
      if (group != null) { 
       int number = new Integer(group.substring(0, group.length()-1)); 
       if(matcher.group(i).endsWith("H")){ 
        hour = number; 
       } else if(matcher.group(i).endsWith("M")){ 
        minute = number; 
       } else if(matcher.group(i).endsWith("S")){ 
        second = number; 
       } 
      } 
     } 
    } 

同樣的事情,我已經添加了檢查空。