当前位置: 首页 > 知识库问答 >
问题:

如何使RegEx返回匹配全部值而不是第一个字符

夏侯俊美
2023-03-14

我有一个日志文件,其中有堆栈跟踪,如下所示。我当前将其存储列表

[25/05/21 10:29:09:262 BST] example log entry
[25/05/21 10:29:09:246 BST] another example log entry
[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());
        }
    }

我在这里遇到的问题是,由于某种原因,如果我打印出alldates中的每个值,它给我的只是[而不是[25/05/21 10:29:09:262BST]。我99%肯定我实际的正则表达式是正确的,因为我使用的是一个正则表达式网站,您可以输入一个字符串和一个正则表达式,它将解释匹配。

共有1个答案

空夕
2023-03-14

如果您使用的至少是Java8,则可以使用stream API获得AllDates列表,而不是for循环。

/*
 * import java.util.List;
 * import java.util.regex.Matcher;
 * import java.util.regex.Pattern;
 * import java.util.stream.Collectors;
 */
Pattern pttrn = Pattern.compile("^\\[\\d{2}/\\d{2}/\\d{2,4} \\d{2}:\\d{2}:\\d{2}:\\d{3} BST]");
List<String> allDates = stackTraces.stream()
                                   .filter(stackTrace -> pttrn.matcher(stackTrace).find())
                                   .map(stackTrace -> stackTrace.substring(0, stackTrace.indexOf(']') + 1))
                                   .collect(Collectors.toList());

筛选器仅返回具有所需模式的行。
映射仅返回所需的字符串部分。
收集创建上一个映射返回的所有值的列表。

 类似资料: