gpt4 book ai didi

来自 Perl 类型正则表达式的 Java 正则表达式

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:55:29 24 4
gpt4 key购买 nike

我正在尝试从日志文件中的字符串时间戳中提取小时、分钟、秒和纳秒。这是我正在测试的输入字符串:

 SOME_TEXT,+09:30:01.040910105,SOME_TEXT,SOME_TEXT,SOME_TEXT

在 Perl/Python 中,我会使用以下正则表达式对我感兴趣的字段进行分组:

 (\d\d)\:(\d\d)\:(\d\d)\.(\d{9})

您可以验证正则表达式是否适用于 http://regexpal.com 处的测试字符串如果你好奇的话。

所以我试着写了一个简单的Java程序,可以提取字段:

import java.util.regex.*;

public class Driver
{
static public void main(String[] args)
{
String t = new String("SOME_TEXT,+09:30:01.040910105,SOME_TEXT,SOME_TEXT,SOME_TEXT");
Pattern regex = Pattern.compile("(\\d\\d):(\\d\\d):(\\d\\d)\\.(\\d{9})");
Matcher matches = regex.matcher(t);
for (int i=1; i<matches.groupCount(); ++i)
{
System.out.println(matches.group(i));
}
}
}

但是,我的正则表达式没有正确翻译。以下异常表明它没有找到任何匹配项:

 Exception in thread "main" java.lang.IllegalStateException: No match found
at java.util.regex.Matcher.group(Matcher.java:485)
at Driver.main(Driver.java:12)

我如何正确地将正则表达式从 Perl/Python 风格转换为 Java?

最佳答案

正则表达式本身没问题。但是,代码有两个问题:

  1. 你需要调用 Matcher.find() ;
  2. 你需要修复 for循环(它应该使用 <= 而不是 < )。

修改后的版本:

public class Driver
{
static public void main(String[] args)
{
String t = new String("SOME_TEXT,+09:30:01.040910105,SOME_TEXT,SOME_TEXT,SOME_TEXT");
Pattern regex = Pattern.compile("(\\d\\d):(\\d\\d):(\\d\\d)\\.(\\d{9})");
Matcher matcher = regex.matcher(t);
while (matcher.find()) {
for (int i=1; i<=matcher.groupCount(); ++i)
{
System.out.println(matcher.group(i));
}
}
}
}

打印出来:

09
30
01
040910105

关于来自 Perl 类型正则表达式的 Java 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7584698/

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