извлекать набор строк из файла на основе сопоставления с образцом - PullRequest
1 голос
/ 24 октября 2019

У меня есть файл, который содержит тысячи кортежей (набор из трех строк) следующим образом:

# dev2
SAMETEXT %{URI} ^dev2-00.XXX.XXX.XXX
SAMETEXT %{URI}  ^/XXX/
DIFFTEXT ^/XXX/(.*) https://XXX-XXX-XXX-XXX-dev2.XXX.XXX.XXX.XXX.XXX/XXX/$1 [X,Y]

Существует несколько наборов одного типа с разными данными, такими как dev1, dev2, dev3. Теперь я хочу получить все строки таким же образом, как они есть в файле, кроме dev2. В файле есть случайные или смешанные группы, но все группы состоят из одинаковых строк, как указано выше.

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

Pattern dev2Pattern = Pattern.compile("dev2\\R.*dev2-00.*\\RRewriteRule.*dev2", Pattern.DOTALL);

Однако моя цель - НЕ получить соответствующий шаблон в результате. файл. Заранее благодарен.

1 Ответ

2 голосов
/ 24 октября 2019

Если вы хотите сопоставить все строки после # dev, за исключением случаев, когда это # dev 2, вы можете использовать отрицательный прогноз, чтобы утверждать, что сразу после dev нет 2.

Затем сопоставьте все строки, которыене начинайте с # dev, за которым следует цифра.

^# dev(?!2\b)[0-9]+(?:\R(?!# dev[0-9]).*)*
  • ^ Начало строки
  • # dev(?!2\b) Совпадение # dev и утверждение того, что находится непосредственно направо не 2 и граница слова
  • [0-9]+ совпадение 1+ цифр
  • (?: группа без захвата
    • \R совпадение последовательности новой строки в Unicode
    • (?!# dev[0-9]) Подтвердите, что прямо справа не является # dev и цифрой
    • .* Если это так, сопоставьте 0+ раз любой символ, кроме новой строки
  • )* Закрыть группу и повторить 0+ раз

Regex demo | Java Demo

В Java

String regex = "^# dev(?!2\\b)[0-9]+(?:\\R(?!# dev[0-9]).*)*";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...