Java 如何让正则表达式返回匹配的完整值而不仅仅是第一个字符
我有一个日志文件,其中有堆栈跟踪,看起来像这样。我目前将其存储为Java 如何让正则表达式返回匹配的完整值而不仅仅是第一个字符,java,regex,Java,Regex,我有一个日志文件,其中有堆栈跟踪,看起来像这样。我目前将其存储为列表 我想写一些方法,返回每个日志条目的日期。所以我的输出看起来像。我不介意如何将其理想地存储为列表,但现在它并不太重要 [25/05/21 10:29:09:262 BST] [25/05/21 10:29:09:246 BST] 我当前的代码看起来像 List<String> allDates = new ArrayList<String>(); for (String stackTrace :
列表
我想写一些方法,返回每个日志条目的日期。所以我的输出看起来像。我不介意如何将其理想地存储为列表
,但现在它并不太重要
[25/05/21 10:29:09:262 BST]
[25/05/21 10:29:09:246 BST]
我当前的代码看起来像
List<String> allDates = new ArrayList<String>();
for (String stackTrace : stackTraces) {
Matcher m = Pattern.compile("^([\\d{2}[^0-9]\\d{2}[^0-9]\\d{2,4}.\\d{2} \\d{2}:\\d{2}:\\d{2}:\\d{3} BST])")
.matcher(stackTrace);
while (m.find()) {
allDates.add(m.group());
}
}
List allDates=new ArrayList();
用于(字符串stackTrace:stackTraces){
匹配器m=Pattern.compile(“^([\\d{2}[^0-9]\\d{2}[^0-9]\\d{2,4}.\\d{2}\\d{2}:\\d{2}:\\d{2}:\\d{2}:\\d{3}BST]))
.匹配器(stackTrace);
while(m.find()){
allDates.add(m.group());
}
}
我在这里遇到的问题是,出于某种原因,如果我打印出
allDates
中的每个值,它只会给我[
而不是[25/05/21 10:29:09:262英国夏令时]
。我99%确信我的实际正则表达式是正确的,因为我使用的是一个正则表达式网站,在那里你可以输入字符串和正则表达式,它将解释匹配。你在在线正则表达式测试网站上编写的正则表达式是错误的。你被[\d{2}[^0-9]欺骗,相信它是有效的
字符类与数字实际匹配,{
,2
,}
,[
或^
(使用PCRE/JS正则表达式设置)
您必须记住转义[
文字字符,并删除\\d{2}
部分,因为示例字符串中该位置没有多余的两位数字
因此,您可以使用
^\[\d{2}/\d{2}/\d{2,4} \d{2}:\d{2}:\d{2}:\d{3} BST]
请参阅。在您的代码中,它将如下所示
List stackTraces=Arrays.asList(“[25/05/21 10:29:09:262 BST]示例日志条目”,“[25/05/21 10:29:09:246 BST]另一个示例日志条目”);
模式p=Pattern.compile(“^\\[\\d{2}/\\d{2}/\\d{2,4}\\d{2}:\\d{2}:\\d{2}:\\d{3}BST]”);
List allDates=new ArrayList();
用于(字符串stackTrace:stackTraces){
匹配器m=p.匹配器(stackTrace);
if(m.find()){
allDates.add(m.group());
}
}
系统输出打印项次(所有日期);
看
注意:
- 您只需要一个匹配项,因为每个预期匹配项都位于每个字符串的起始位置,所以将
替换为while
if
- 要获取不带括号的日期时间,请在正则表达式中使用一个捕获组:
然后Pattern p=Pattern.compile(^\[(\\d{2}/\\d{2}/\\d{2,4}\\\d{2}:\\d{2}:\\d{2}:\\d{3}BST)];
(组值)所有日期.add(m.group(1))
此外,每当您使用在线网站创建正则表达式时,请确保您也利用了一项功能。您被在线正则表达式测试仪上的
[\d{2}[^0-9]
字符类欺骗,该字符类实际匹配一个数字,{/code>,2
,}
,[
或^
。您的正则表达式是错误的。是正确的。另外,请始终检查页面。这就像\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
在进入for
循环之前,您应该创建模式
一次。您可以对多个字符串
重复使用相同的模式。非常感谢!我对这些非常陌生,也不知道。但这可以解决问题,解决方案也很有意义,谢谢
^\[\d{2}/\d{2}/\d{2,4} \d{2}:\d{2}:\d{2}:\d{3} BST]