Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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_Regex - Fatal编程技术网

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]