Соответствует регулярному выражению, только если одна и та же строка найдена дважды - PullRequest
0 голосов
/ 16 января 2019

Я использую Cisco Prime Infrastrucure, которая использует движок Java regex. Я хотел бы иметь регулярное выражение, которое соответствует, только если определенная строка найдена ровно дважды в конкретной конфигурации (вывод текста)

Я попытался сопоставить соответствующую область, установить ее в группе, а затем попытаться сопоставить то же самое с возвратом:

(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 голосов
/ 16 января 2019

Вы можете использовать

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

См. Демоверсию regex .

.*\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";
0 голосов
/ 16 января 2019

Я не совсем уверен, что именно вы пытаетесь сделать, но вот решение, которое я придумал.

(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

Короче говоря, это будет совпадать, если у вас есть две строки подряд, которые точно совпадают после части строки на дату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...