java - 正则表达式匹配计时器与 h :m:s

标签 java regex lookahead

我一直致力于匹配来自客户的变量。它是这样写的:

0s
12s
1m15s
15m0s
1h0m5s
1h15m17s

我想在一次查找中捕获所有三组数字。

(\d+)(?=h(\d+)m(\d+))*?(?=m(\d+))*?

我在上面一直在研究的正则表达式只会在每个新发现中获取连续的组。

例子:

input is 12s group 1 is 12 ... works.

输入是 1m12s 第 1 组是 1 但是要得到 12,我必须再次使用 find 来找到下一组 12。

请注意,因为我没有立即想到,请确保检查组是否为空以捕获可选组。

最佳答案

试试这个方法:

((\d+)h)?((\d+)m)?((\d+)s)

然后您捕获第 2 组的小时数、第 4 组的分钟数和第 6 组的秒数

在这里查看它的工作情况:https://regex101.com/r/bZ4zW4/2

以图形方式:

Regular expression visualization

Debuggex Demo

编辑

要在 JAVA 中获取结果(自上次编辑以来),请执行以下操作:

Pattern p = Pattern.compile("((\\d+)h)?((\\d+)m)?((\\d+)s)");
Matcher m = p.matcher("1h15m17s");
if (m.find()){
    Integer hour = Integer.valueOf(m.group(2));
    Integer minute = Integer.valueOf(m.group(4));
    Integer second = Integer.valueOf(m.group(6));
    System.out.println(hour + " - " + minute + " - " + second);
}

m = p.matcher("1h0m5s");
if (m.find()){
    Integer hour = Integer.valueOf(m.group(2));
    Integer minute = Integer.valueOf(m.group(4));
    Integer second = Integer.valueOf(m.group(6));
    System.out.println(hour + " - " + minute + " - " + second);
}

m = p.matcher("15m0s");
if (m.find()){
    Integer minute = Integer.valueOf(m.group(4));
    Integer second = Integer.valueOf(m.group(6));
    System.out.println(minute + " - " + second);
}

m = p.matcher("12s");
if (m.find()){
    Integer second = Integer.valueOf(m.group(6));
    System.out.println(second);
}

m = p.matcher("0s");
if (m.find()){
    Integer second = Integer.valueOf(m.group(6));
    System.out.println(second);
}

输出将分别是:

1 - 15 - 17
1 - 0 - 5
15 - 0
12
0

请注意,在每种情况下,我都会得到一个特定的值。如果您尝试从不存在的 matcher 获取一分钟,您将得到一个 java.lang.NumberFormatException,因为它将返回 null。所以你必须先检查一下。下面的 block 将在提到的异常中结束:

m = p.matcher("0s");
if (m.find()){
    Integer minute = Integer.valueOf(m.group(4)); //exception here
    Integer second = Integer.valueOf(m.group(6));
    System.out.println(second);
}

关于java - 正则表达式匹配计时器与 h :m:s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35052712/

相关文章:

java - 将树(非二进制)转换为路径列表

1=1 的 Java 正则表达式

java - libgdx - 将多个纹理合并为一个

java - 更改 SplitPane 内 Pane 的增长比率

新声明前的 Java 关键字

regex - 如何搜索整行

arrays - 通过改变数据结构来加速在 Perl 中的数组搜索

regex - 正则表达式、先行和后行的命名约定

正则表达式 + 最短子串 + 以另一个单词开头的单词

regex - 为什么前瞻(有时)比捕获快?