2016-09-12 29 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; 
       } 
      } 
     } 
    } 

同样的事情,我已经添加了检查空。