我正在使用使用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
!
我不应该匹配,因为两行不同。希望在正则表达式中甚至可能出现这种情况。我无法为此使用功能。
答案 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
简而言之,如果一行中有两行在日期部分之后完全相同,那么这将是匹配的。