从日志文件中的日期获取月份

时间:2019-02-26 19:49:11

标签: java

我有一个输入字符串格式如下。

96.7.4.14 - - [24/Apr/2011:04:20:11 -0400] "GET /cat.jpg HTTP/1.1" 200 1243

我知道如何从字符串中获取整个日期,但是提取三个字母月份代码的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

您可以使用以下正则表达式提取月份中的三个字母

(?<=\d{2}\/)(\w{3})(?=\/\d{4})

它的基本工作是在后面寻找两个数字和一个斜杠,同时在寻找三个斜体字的同时寻找一个斜杠和4个数字。


以下是一个更简单的解决方案,不使用正则表达式,因为字符串的开头始终包含相同格式的字符,如下所示

String text = "96.7.4.14 - - [24/Apr/2011:04:20:11 -0400] \"GET /cat.jpg HTTP/1.1\" 200 1243";
int firstLetterOfMonth = text.indexOf('/') + 1;
String month = text.substring(firstLetterOfMonth, firstLetterOfMonth + 3);
System.out.println(month); // Apr

答案 1 :(得分:1)

您可以提供一种模式来查找整个日期:

private static final Pattern p = Pattern.compile("(\\d{2}\\/)(\\w{3})(\\/\\d{4})");

,然后使用匹配器找到包含三个字母的单词(又称为月份)的组:

Matcher m = p.matcher("96.7.4.14 - - [24/Apr/2011:04:20:11 -0400] GET /cat.jpg HTTP/1.1 200 1243");

if (m.find()) {
    System.out.println(m.group(2)); // second expression from the round brackets
}

答案 2 :(得分:0)

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class x {

    public static void main (String [] args) {
        String data = "96.7.4.14 - - [24/Apr/2011:04:20:11 -0400] \"GET /cat.jpg HTTP/1.1\" 200 1243";

        Pattern p = Pattern.compile("\\d{2}/(\\w{3})/\\d{4}");
        Matcher m = p.matcher(data);
        if (m.find())
            System.out.println(m.group(1));
    }
}

输出:

Apr

根据要匹配的潜在字符串的范围,您可以使用更简单的模式来实现,例如只需要在一对正斜杠之间寻找三个单词字符。这只是一个例子。我并不是说这是满足您需求的最佳表达方式。