首页 > 解决方案 > 仅在超过一定数量时才返回重复的组

问题描述

我正在设置一个正则表达式来查找日志中的空指针异常。正则表达式非常简单:

(java\.lang\.NullPointerException)

这会从我的日志中返回三个组:

2020-01-31 00:00:01 - Searching for account details
Error:
java.lang.NullPointerException
2020-01-31 00:00:30 - Searching for account details
Error:
java.lang.NullPointerException
2020-01-31 00:00:50 - Searching for account details
Error:
java.lang.NullPointerException

我想做的是将其设置为仅在匹配组超过一定数量时才返回结果。例如,(java.lang.NullPointerException){2,} 理论上应该返回两个或更多组的结果,而 {4,} 不应该匹配。到目前为止,我一直在阅读有关为此使用大括号的信息,但除了 {1,} 之外,我无法让它与其他任何东西一起使用 - 其他所有内容都不会返回任何匹配项。

编辑:感谢帕维尔的回答。我对我的用例做了一些修改:

(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s-\sSearching\sfor\saccount\sdetails\nError:\njava\.lang\.NullPointerException[\s\S]){10,}

此模式将准确匹配从日期到空指针错误的消息。我还删除了*from [\s\S],以确保它只捕获 10 个连续错误。这样,如果有 10 个或更多实例:

2020-01-31 00:00:01 - Searching for account details
Error:
java.lang.NullPointerException

它将返回匹配项。但如果有类似的东西:

2020-01-31 00:00:50 - Searching for account details
Error:
java.lang.NullPointerException
2020-01-31 00:00:50 - Searching for account details
Found something:
Hello world
2020-01-31 00:00:50 - Searching for account details
Error:
java.lang.NullPointerException

hello world由于消息之间存在消息,因此不会返回匹配项。直到事后我才想到这个用例,所以我没有将它包含在原始问题中。

标签: regexloggingmatch

解决方案


这如您所描述的那样有效:

(java\.lang\.NullPointerException[\s\S]*){2,}

看,您需要将 [\s\S]* 添加到末尾,以便它匹配两个异常之间的所有字符,包括空格。

这是演示:https ://regex101.com/r/dnIgKs/1/


推荐阅读