Получить все уникальные имена файлов - PullRequest
6 голосов
/ 12 апреля 2019

К предисловию, я новичок в регулярных выражениях.У меня есть строка, которая выглядит примерно так:

     my_folder/foo.xml::someextracontent
     my_folder/foo.xml::someextracontent
     another_folder/foo.xml::someextracontent
     my_folder/bar.xml::someextracontent
     my_folder/bar.xml::someextracontent
     my_folder/hello.xml::someextracontent

Я хочу вернуть уникальные файлы XML, которые являются частью my_folder.Таким образом, регулярное выражение вернется:

my_folder/foo.xml
my_folder/bar.xml
my_folder/hello.xml

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

Самая близкая попытка, которую я получил, была (?sm)(my_folder\/.*?.xml)(?=.*\1), которая получает все дубликаты, но я хочу противоположного, поэтому я попытался сделать отрицательный взгляд вперед вместо (?sm)(my_folder\/.*?.xml)(?!.*\1), но группы захвата совершенно не верны.

Чего мне не хватает в моем регулярном выражении?Вот ссылка на регулярное выражение: https://regex101.com/r/ggY2RB/1

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Вместо использования положительного взгляда (?=, чтобы получить уникальные строки, вы можете использовать отрицательный взгляд (?!, чтобы утверждать, что справа не то, что вы захватили в группе 1.

В вашем паттерне вы используете, чтобы точка соответствовала символу новой строки, используя (?s), и начинаете с не жадной точки .*?, но вы также можете использовать класс отрицанных символов, соответствующий символу новой строки или косой черты.

Если папка также может содержать вложенные папки, вы можете использовать шаблон, который повторяет 0+ раз 1+ пробел с последующим косой чертой.

(?s)(my_folder/(?:[^/\n]+/)*[^/\n]+\.xml)::(?!.*\1)
  • (?s)
  • ( Группа захвата
    • my_folder/ Совпадение буквально
    • (?:[^/\n]+/)* Повторите 0+ раз, не косую черту или символ новой строки, а затем косую черту
    • [^/\n]+\.xml Совпадение 1+ без косой черты или символа новой строки, за которым следует .xml
  • ) Закрыть группу захвата
  • ::(?!.*\1) Совпадение :: с последующим подтверждением того, что справа, не содержит того, что захвачено в группе 1

В Java

String regex = "(?s)(my_folder/(?:[^/\\n]+/)*[^/\\n]+\\.xml)::(?!.*\\1)";

Regex demo | Java демо

1 голос
/ 12 апреля 2019

Этот RegEx может помочь вам найти уникальные строки, которые вы можете искать:

/(\w+\/\w+\.xml)(?![\s\S]*\1)/s

enter image description here

Если вы хотите соответствовать только my_folder, вы можете попробовать this :

 /(\my_folder\/\w+\.xml)(?![\s\S]*\1)/s

enter image description here

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