仅当两次发现相同字符串时才匹配正则表达式

时间:2019-01-16 13:27:06

标签: java regex

我正在使用使用Java regex引擎的Cisco Prime基础设施。我想拥有一个仅在特定配置(文本输出)中两次发现某个字符串恰好两次的情况下才匹配的正则表达式

我尝试匹配相应的区域,将其设置在一个组中,然后尝试通过回溯重新匹配完全相同的东西:

(at \d{2}\:\d{2}\:\d{2} CET \D{3} \D{3} \d+ \d{4} by \D{6})\1

\1 matches the same text as most recently matched by the 1st capturing group

所以基本上,如果我针对以下文本运行正则表达式:

Current configuration : 11518 bytes
!
! Last configuration change at 12:48:00 CET Thu Jan 3 2019 by admjos
! NVRAM config last updated at 12:48:00 CET Thu Jan 3 2019 by admjos
!

我应该得到一个比赛,因为它们是相同的。但是如果我反对:

Current configuration : 11524 bytes
!
! Last configuration change at 10:40:46 CET Wed Jan 16 2019 by admjos
! NVRAM config last updated at 12:48:02 CET Thu Jan 3 2019 by admjos
!

我不应该匹配,因为两行不同。希望在正则表达式中甚至可能出现这种情况。我无法为此使用功能。

2 个答案:

答案 0 :(得分:1)

您可以使用

String regex = "(at \\d{2}:\\d{2}:\\d{2} CET \\D{3} \\D{3} \\d+ \\d{4} by \\D{6}).*\\R.*\\1";
                                                                                 ^^^^^^^

请参见regex demo

.*\n.*将另外匹配组1模式匹配的行的其余部分,然后是一个换行符序列(\R),然后是除换行符之外的任何0+字符,然后是与捕获到第1组中的文本完全相同的子字符串。

请注意,您可以使用at将第一个\b作为整个单词进行匹配:

String regex = "\\b(at \\d{2}:\\d{2}:\\d{2} CET \\D{3} \\D{3} \\d+ \\d{4} by \\D{6}).*\\R.*\\1";

答案 1 :(得分:0)

我不确定您到底要做什么,但这是我想出的解决方案。

(at [0-9]{2}:[0-9]{2}:[0-9]{2}.*)\n.*\1

让我一步一步地分解我所能达到的最基本水平。

(开始捕获组
at完全匹配“在”
[0-9]{2}:[0-9]{2}:[0-9]{2}以您上面的格式匹配日期
.*匹配任意字符中的0个或多个(换行符除外)
)结束捕获组
\n匹配换行符
.*匹配任意字符中的0个或多个(换行符除外)
\1匹配捕获组1

简而言之,如果一行中有两行在日期部分之后完全相同,那么这将是匹配的。