想要使用正则表达式从文本文件中提取值

时间:2016-09-02 10:06:29

标签: java regex

"00.00.00.00" 00.00.00.00 - - [07/Jun/2016:00:00:00 -0700] "Hey /acd?bg=1 HTTP/1.1" 200 2 "-" "00.00.00.00:0000" "Java/1.8.0_66" - - 2000 

上面有记录,我想从所有字段中提取值,每个字段用空格分隔,请帮忙

我使用如下:

String p;
    Pattern pattern = Pattern.compile(p);
    Matcher matcher = pattern.matcher(str);
    if (matcher.find()){
    System.out.println(matcher.group(1));
    }

但我没有得到正确的输出。我是正则表达式的新手 期望的输出是

00.00.00.00
00.00.00.00
-
-
07/Jun/2016:00:00:01 -0700
Hey /acd?bg=1 HTTP/1.1
200 

1 个答案:

答案 0 :(得分:0)

我有一个可以做你想要的模式,但它并不漂亮:

^"((?:\d\d?\d?\.){3}\d\d?\d?)" ((?:\d\d?\d?\.){3}\d\d?\d?) (-) (-) (\[\d\d\/\w+\/\d{4}(?::\d\d){3} -\d{4}\]) "(.*?)" (\d{3})

稍微分解一下(因为它很讨厌):

^使其从字符串的开头开始。

((?:\d\d?\d?\.){3}\d\d?\d?)将匹配并捕获第一个IP地址,每个元素由1到3位数字组成。然后使用相同的模式匹配第二个IP地址。

(-)会捕捉连字符 - 不确定为什么要这样,但它在你想要的输入中。

(\[\d\d\/\w+\/\d{4}(?::\d\d){3} -\d{4}\])捕获时间戳(方括号中的位)。

"(.*?)"将匹配并捕获文本字符串。

最后,(\d{3})将捕获HTTP状态代码。

总而言之,此模式将匹配您所提供的字符串中的内容。