Есть ли код Regex для объединения кодов, которые я должен посмотреть выше и посмотреть между строк? - PullRequest
2 голосов
/ 07 ноября 2019

Допустим, это моя тестовая строка:

XXX 3.14 QQQ
XXX 3.14 QQQ
YYY

Я бы хотел, чтобы второй 3.14 был точным соответствием. Я думаю, что для этого потребуется объединить следующие две строки кода:

  • ((?<=XXX ).*(?= QQQ)), который выбирает оба значения 3.14.
  • .*\n(?=((.*\n){1})(YYY)), который выбирает полную вторую строку.

Однако, когда я использую ((?<=XXX ).*(?= QQQ)).*\n(?=((.*\n){1})(YYY)), точное совпадение - это второе "3.14" и "QQQ".

Любая помощь поможет узнать, как сопоставить второе 3.14 с использованиемэти формулы очень приветствуются.

Спасибо

Ответы [ 3 ]

0 голосов
/ 07 ноября 2019

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

^XXX \d+\.\d+ QQQ\r?\nXXX (\d+\.\d+) QQQ\r?\nYYY\b
  • ^ Startстроки
  • XXX \d+\.\d+ QQQ соответствует первой строке
  • \r?\n соответствует новой строке
  • XXX (\d+\.\d+) QQQ соответствует второй строке и захватывает номер в группе захвата
  • \r?\nYYY\b Соответствует новой строке, YYY и границе слова

Regex demo

0 голосов
/ 07 ноября 2019

Если вы находитесь на правильном пути, должно работать следующее:

(?<=^XXX )[^\n]*(?= QQQ$)(?!.*^XXX [^\n]* QQQ$)

, в котором говорится, что совпадают все (кроме новой строки) между <start of line>XXX и QQQ<end of line>, если за ними не следует другая последовательность ^XXX [^\n]* QQQ$.

Для правильной работы вышеприведенного регулярного выражения необходимо установить многострочный флаг (m), чтобы ^ и $ соответствовали началу и концу строки, а нестрока. Вам также необходимо установить флаг «одна строка / точка все» (s).

Если вас не волнует, что XXX находится рядом с началом строки, а QQQ - рядом сВ конце строки вы можете опустить якоря ^ и $, и вам не нужно устанавливать многострочный флаг. Эта версия будет выглядеть так:

(?<=XXX )[^\n]*?(?= QQQ)(?!.*XXX [^\n]* QQQ)
0 голосов
/ 07 ноября 2019

Если это действительно ваша строка, а не только ее часть, вы можете использовать \A, самое начало строки :

^(?<!\A)XXX(.+?)QQQ$

См. демонстрация на regex101.com .


Возможно, будет проще указать язык программирования и использовать соответствующее местоположение массива в найденных совпадениях (например, results[1]).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...