只有当相同的字符串出现两次时才匹配正则表达式

3

我正在使用Cisco Prime Infrastrucure,它使用Java正则表达式引擎。我想要一个正则表达式,只有在特定配置(文本输出)中确切出现两次某个字符串时才匹配。

我尝试匹配相应的区域,将其设置在一个组中,然后尝试使用回溯精确地重新匹配相同的内容:

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

\1 匹配第一个捕获组最近匹配的文本。

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

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
!

我不应该匹配成功,因为这两行不同。希望在正则表达式中有类似的解决方案是可能的。我没有使用函数的可能性。


4
在 "\1" 前添加 .*\n.* - Wiktor Stribiżew
WTF,你只用了2分钟就解决了我已经苦恼了几个小时的问题...它完美地运行了,非常感谢! - Mario Jost
1
@MarioJost 他是正则表达式的传奇。 - soorapadman
@MarioJost 我添加了一个回答,附带解释和演示。 - Wiktor Stribiżew
2个回答

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

查看正则表达式演示.

.*\n.*将匹配第一组模式匹配的整个剩余行,然后是一个换行符序列(\R),然后再次是任何0+个不是换行符的字符,然后是与第一组捕获的文本完全相同的子字符串。

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

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

0

我不太确定你想做什么,但这是我想出的解决方案。

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

让我逐步分解一下最基本层次上正在发生的事情。

( 开始捕获组
at 精确匹配 "at "
[0-9]{2}:[0-9]{2}:[0-9]{2} 匹配你上面所述格式的日期
.* 匹配 0 或多个任意字符(不包括换行符)
) 结束捕获组
\n 匹配换行符
.* 匹配 0 或多个任意字符(不包括换行符)
\1 匹配捕获组 1

简而言之,这将匹配如果你有两行连续的文本,在 at 日期部分后完全相同的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接