Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅当两次找到相同字符串时才匹配正则表达式_Java_Regex - Fatal编程技术网

Java 仅当两次找到相同字符串时才匹配正则表达式

Java 仅当两次找到相同字符串时才匹配正则表达式,java,regex,Java,Regex,我正在使用Cisco Prime Infrastructure,它使用Java正则表达式引擎。如果在特定配置(文本输出)中发现某个字符串正好两次,我希望有一个只匹配的正则表达式 我尝试匹配相应的区域,将其设置为一组,然后尝试使用回溯重新匹配完全相同的对象: (at \d{2}\:\d{2}\:\d{2} CET \D{3} \D{3} \d+ \d{4} by \D{6})\1 \1与第一个捕获组最近匹配的文本相同 基本上,如果我对以下文本运行正则表达式: Current configurat

我正在使用Cisco Prime Infrastructure,它使用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
!

我不应该找到匹配的,因为这两行不同。希望类似的事情在正则表达式中也能实现。我不可能使用函数来实现这一点。

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

(在[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

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

您可以使用

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

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

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

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

*\n.*
添加到
\1
WTF之前,您刚刚回答了一个我在短短2分钟内处理了数小时的问题。。。它很有魅力,非常感谢@MarioJost他是regex的传奇。@MarioJost I,下面有解释和演示。