【问题标题】:Create a pattern regex to extract hour and minute from string in JAVA创建模式正则表达式以从 JAVA 中的字符串中提取小时和分钟
【发布时间】:2019-02-21 00:58:28
【问题描述】:

我正在尝试从 JAVA 中的字符串中制作可以给我小时和分钟的模式。 无论我尝试一个或多个示例都失败了。

可以有以下组合。

  1. 1 小时
  2. 2 小时
  3. 1 小时 20 分钟
  4. 3 小时 30 分钟
  5. 3 小时 1 分钟
  6. 1 小时 1 分钟
  7. 1 分钟
  8. 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
    }
    

【问题讨论】:

  • 这不仅仅是您的正则表达式模式的问题。您的逻辑将需要针对匹配的组数以及其中的内容运行额外的 if 语句。
  • 就像您期望上述示例的输出一样???
  • 你需要重新考虑你的代码,但我会给你这个模式让你走上正确的轨道regex101.com/r/DNCYMl/2

标签: java regex pattern-matching


【解决方案1】:

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

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

虽然我已经命名了这些组以使其更易于访问,但是这并不是真正需要的。即使没有命名组,group1 将始终捕获小时,group2 将始终捕获分钟,无论您的数据包含什么,无论是仅几小时还是仅几分钟或两者兼而有之。

Demo

另外,请检查此 Java 代码。

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

【讨论】:

  • 我建议以 ^(?=.) 开头的模式,这样它就不会匹配空字符串。
  • @CAustin:是的,这很好。感谢您指出。让我用你的建议更新我的帖子。虽然字符串验证更需要这种严格的检查,但是当涉及到字符串的匹配和提取时,它并不是真正需要的。
猜你喜欢
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
相关资源
最近更新 更多