[英]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.