来自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"]