gpt4 book ai didi

java - 如何获取正则表达式匹配的组值

转载 作者:IT老高 更新时间:2023-10-28 20:41:14 32 4
gpt4 key购买 nike

我有以下代码行

String time = "14:35:59.99";
String timeRegex = "(([01][0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])(.([0-9]{1,3}))?";
String hours, minutes, seconds, milliSeconds;
Pattern pattern = Pattern.compile(timeRegex);
Matcher matcher = pattern.matcher(time);
if (matcher.matches()) {
hours = matcher.replaceAll("$1");
minutes = matcher.replaceAll("$4");
seconds = matcher.replaceAll("$5");
milliSeconds = matcher.replaceAll("$7");
}

我使用 matcher.replace 方法和正则表达式组的反向引用来获取小时、分钟、秒和毫秒。有没有更好的方法来获得正则表达式组的值(value)。我试过了

hours = matcher.group(1);

但它会引发以下异常:

java.lang.IllegalStateException: No match found
at java.util.regex.Matcher.group(Matcher.java:477)
at com.abnamro.cil.test.TimeRegex.main(TimeRegex.java:70)

我错过了什么吗?

最佳答案

如果您避免调用 matcher.replaceAll,它会正常工作。当您调用 replaceAll 时,它会忘记任何以前的匹配项。

String time = "14:35:59.99";
String timeRegex = "([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(?:\\.([0-9]{1,3}))?";
Pattern pattern = Pattern.compile(timeRegex);
Matcher matcher = pattern.matcher(time);
if (matcher.matches()) {
String hours = matcher.group(1);
String minutes = matcher.group(2);
String seconds = matcher.group(3);
String miliSeconds = matcher.group(4);
System.out.println(hours + ", " + minutes + ", " + seconds + ", " + miliSeconds);
}

请注意,我还对您的正则表达式进行了一些改进:

  • 我已将非捕获组 (?: ... ) 用于您对捕获不感兴趣的组。
  • 我已将匹配任何字符的 . 更改为仅匹配点的 \\.

在线查看:ideone

关于java - 如何获取正则表达式匹配的组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11666356/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com