Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JAVA中创建一个模式regex,从字符串中提取小时和分钟_Java_Regex_Pattern Matching - Fatal编程技术网

在JAVA中创建一个模式regex,从字符串中提取小时和分钟

在JAVA中创建一个模式regex,从字符串中提取小时和分钟,java,regex,pattern-matching,Java,Regex,Pattern Matching,我正在尝试制作一个模式,它可以让我从JAVA中的字符串中获得数小时和数分钟的时间。 无论我尝试什么,一个或多个例子都失败了 可以有以下组合 1小时 2小时 1小时20分钟 3小时30分钟 3小时1分钟 1小时1分钟 1分钟 10分钟 Pattern p = Pattern.compile("([\\d]+)\\s+[hour|hours]*\\s*([\\d]*)[^\\d]*"); Matcher m = p.matcher("8 hours 2 minutes"); // if an

我正在尝试制作一个模式,它可以让我从JAVA中的字符串中获得数小时和数分钟的时间。 无论我尝试什么,一个或多个例子都失败了

可以有以下组合

1小时 2小时 1小时20分钟 3小时30分钟 3小时1分钟 1小时1分钟 1分钟 10分钟

Pattern p = Pattern.compile("([\\d]+)\\s+[hour|hours]*\\s*([\\d]*)[^\\d]*");


Matcher m = p.matcher("8 hours 2 minutes");

// if an occurrence if a pattern was found in a given string...
if (m.find()) {
    System.out.println("found");
    System.out.println(m.group(1)); // hours
    System.out.println(m.group(2)); // minutes
}

您可以使用此正则表达式,并从匹配的相应组中提取小时和/或分钟

^(?=.)(?:(?<hours>\d+) *hours?)?(?: *(?<minutes>\d+) *minutes?)?$

这不仅仅是正则表达式模式的问题。您的逻辑将需要运行额外的if语句,以确定匹配的组数以及组内的内容。例如,您希望从上述示例中获得什么样的输出???您需要对代码进行重新思考,但为了让您走上正确的轨道,我建议您使用^?=。所以它不匹配空字符串。@CAustin:是的,这是一个很好的观点。谢谢你指出。让我用你的建议更新我的帖子。虽然在验证字符串时更需要这种严格的检查,但当涉及到字符串的匹配和提取时,实际上并不需要这样做。
List<String> list = Arrays.asList("1 hour","2 hours","1 hour 20 minutes","3 hours 30 minutes","3 hours 1 minute","1 hour 1 minute","1 minute","10 minutes");
Pattern p = Pattern.compile("^(?=.)(?:(?<hours>\\d+) *hours?)?(?: *(?<minutes>\\d+) *minutes?)?$");

list.stream().forEach(x -> {
    Matcher m = p.matcher(x);
    if (m.matches()) {
        System.out.println(x + " ----> Hours: " + m.group("hours") + ", Minutes: " + m.group("minutes"));
    } else {
        System.out.println(x + " ----> Didn't match");
    }
});
1 hour ----> Hours: 1, Minutes: null
2 hours ----> Hours: 2, Minutes: null
1 hour 20 minutes ----> Hours: 1, Minutes: 20
3 hours 30 minutes ----> Hours: 3, Minutes: 30
3 hours 1 minute ----> Hours: 3, Minutes: 1
1 hour 1 minute ----> Hours: 1, Minutes: 1
1 minute ----> Hours: null, Minutes: 1
10 minutes ----> Hours: null, Minutes: 10