Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从日志文件中的日期获取月份_Java - Fatal编程技术网

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

Java 从日志文件中的日期获取月份,java,Java,我有一个如下格式的输入字符串 96.7.4.14---[24/Apr/2011:04:20:11-0400]“GET/cat.jpg HTTP/1.1”200 1243 我知道如何从字符串中获取整个日期,但提取三个字母的月份代码的最佳方法是什么 您可以使用下面的正则表达式每月提取三个字母 它所做的基本工作是查找两个数字和一个斜杠,以及查找一个斜杠和四个数字,同时匹配三个单词字符 另一种更简单的解决方案是,如果字符串的开头总是包含相同的格式化字符,则不使用正则表达式,如下所示 String t

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

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


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

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

它所做的基本工作是查找两个数字和一个斜杠,以及查找一个斜杠和四个数字,同时匹配三个单词字符


另一种更简单的解决方案是,如果字符串的开头总是包含相同的格式化字符,则不使用正则表达式,如下所示

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
输出:

Apr

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

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

private static final Pattern p = Pattern.compile("(\\d{2}\\/)(\\w{3})(\\/\\d{4})");
然后使用匹配器查找具有三个字母单词(又名月份)的组:


使用正则表达式贪婪…正则表达式谢谢你,我也不知道这个网站的存在,这样在将来会有所帮助。我不确定这个表达式将如何真正做到所要求的。它并没有定义一个围绕着你想从字符串中得到的东西的组。我想也许有一种方法可以利用其他小组来达到你想要的,但这不是一种简单的方法。此外,也没有必要做“向后看”的事情或逃避正斜杠。-您应该提供代码来显示如何使用此表达式提供请求的答案。我是一个regex-weenie,我不知道如何使用您的表达式来获得所需的内容。@Steve是对的-这个答案过于复杂,建议使用不必要的regex实践。我同意没有理由逃避向前的打击。我试过史蒂夫的密码。没有这样的转义就行了。@Steve代码行得通,我已经拥有了一切,我只是需要正则表达式的帮助。我运行了多次我指的是这个表达式,它确实在做我需要它做的事情,从字符串中抽出几个月的时间……我们在同一时间提出了基本相同的解决方案。:)我相信在你的模式中,你的前斜杠缺少了一个转义字符。哦……对不起@Babyburger-把你当作另一个回答者-你不需要转义前斜杠。它们在正则表达式中没有任何意义,不需要避开正斜杠或在表达式的其他部分周围放置组。但是是的,这也行!
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
}