簡體   English   中英

在Java中使用Regex解析時間

[英]Parsing time with Regex in Java

下面截斷的代碼試圖提取字符串的小時,分​​鍾和秒。 例如:“ PT5M30S”
“ PT1H13M59S”

我在這一行中得到一個NullPointerException(group = null):int number = new Integer(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;
            } 
        }
    }

只需嘗試分別針對兩個String編譯此代碼。

然后,您會注意到該程序已成功為第二個String(即PT1H13M59S編譯,而它為第一個String(即PT5M30S提供了NullPointerException

您從第一個String PT5M30S獲得此NullPointerException ,因為此String不包含group 1 請注意,您的第一個字符串PT5M30S沒有Hour


觀看此演示

正則表達式

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組沒有輸出。


因此,您應該做的是執行適當的驗證。 只需將您的代碼包含在try catch塊中獲取NullPointerException ,如果發生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;
                    }
                }
            }
        }
    }
}

上面@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;
                } 
            }
        }
     }

我添加了檢查null的同一件事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM