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

来自Perl类型regex的Java正则表达式,java,regex,Java,Regex,我正在尝试从日志文件中的字符串时间戳中提取小时、分钟、秒和纳秒。以下是我正在测试的输入字符串: SOME_TEXT,+09:30:01.040910105,SOME_TEXT,SOME_TEXT,SOME_TEXT 在Perl/Python中,我将使用以下正则表达式对我感兴趣的字段进行分组: (\d\d)\:(\d\d)\:(\d\d)\.(\d{9}) 如果您感到好奇,可以验证regex是否与测试字符串一起工作 因此,我尝试编写一个简单的Java程序来提取字段: import java

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

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

 (\d\d)\:(\d\d)\:(\d\d)\.(\d{9})
如果您感到好奇,可以验证regex是否与测试字符串一起工作

因此,我尝试编写一个简单的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));
    }
  }
}

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

正则表达式本身很好。但是,该代码存在两个问题:

  • 你需要打电话
  • 您需要修复
    for
    循环(默认情况下,它应该使用
    来匹配整个字符串,您必须在开头和结尾添加。*:

    Pattern regex = Pattern.compile(".*(\\d\\d):(\\d\\d):(\\d\\d)\\.(\\d{9}).*");
    
    这应该是可行的,并根据需要对for循环进行其他更正:-)

    哦,不! 我复制了你的代码并用
    if(matches.find()){…}
    包装,然后工作了。你需要这个

    纳秒不见了。您应该执行以下更改:

    for (int i = 1; i <= matches.groupCount(); ++i)
    -------------------^
    

    for(int i=1;iJava打破了perl风格,在不需要的地方引入了复杂性。如果您想以正确的方式在Java中使用正则表达式,请看一看。下面是一些示例:

    方法matches返回一个布尔值,表示是否有正则表达式匹配

    matches("Sergio Oliveira Jr.", "/oliveira/i" ) => true
    
    match方法返回一个数组,其中包含匹配的组。因此,它不仅会告诉您是否有匹配,而且还会在您有匹配的情况下返回匹配的组

    match("aa11bb22", "/(\\d+)/g" ) => ["11", "22"]
    
    方法sub允许您使用regex执行替换

    sub("aa11bb22", "s/\\d+/00/g" ) => "aa00bb00"
    
    支持全局和不区分大小写的正则表达式

    match("aa11bb22", "/(\\d+)/" ) => ["11"]
    match("aa11bb22", "/(\\d+)/g" ) => ["11", "22"]
    matches("Sergio Oliveira Jr.", "/oliveira/" ) => false
    matches("Sergio Oliveira Jr.", "/oliveira/i" ) => true
    
    允许您更改转义字符,以防您不喜欢看到这么多“\”

    match("aa11bb22", "/(\\d+)/g" ) => ["11", "22"]
    match("aa11bb22", "/(#d+)/g", '#' ) => ["11", "22"]
    
    sub("aa11bb22", "s/\\d+/00/g" ) => "aa00bb00"
    
    match("aa11bb22", "/(\\d+)/" ) => ["11"]
    match("aa11bb22", "/(\\d+)/g" ) => ["11", "22"]
    matches("Sergio Oliveira Jr.", "/oliveira/" ) => false
    matches("Sergio Oliveira Jr.", "/oliveira/i" ) => true
    
    match("aa11bb22", "/(\\d+)/g" ) => ["11", "22"]
    match("aa11bb22", "/(#d+)/g", '#' ) => ["11", "22"]