Регулярное выражение для извлечения имени папки из абсолютного пути (Linux)

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

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

/upload/main/state/02022021/

Это было регулярное выражение, которое я использовал

${ "absolute.path":replaceFirst( ".*[/\\\\]{1}([a-zA-Z]+)[/\\\\]{1}(\d{8}).?$", "$1") } ${"absolute.path":replaceFirst(".*(\d{8}).+$", "$1")}


person Sujith Shetty    schedule 06.03.2021    source источник


Ответы (3)


Я бы использовал эти два выражения, если вхождения всегда находятся в одном и том же месте:

  • на дату в последней позиции (?<=\/)[^\/]*?(?=\/$)
  • для состояния в предпоследней позиции (?<=\/)[^\/]*?(?=\/[^\/]*?\/$)

Кроме того, вы можете изменить .* на что-то более конкретное, чтобы повысить надежность.

person Nathan Ruiz    schedule 06.03.2021

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

state = ${"absolute.path":replaceFirst(".*[/\\\\]([^\\\\/]+)[/\\\\]\\d{8}[/\\\\]?$", "$1")}
date  = ${"absolute.path":replaceFirst(".*[/\\\\](\\d{8})[\\\\/]?$", "$1")}

См. демонстрацию регулярного выражения #1 и демонстрация регулярного выражения #2.

Дело в том,

  1. Убедитесь, что регулярное выражение соответствует всей входной строке
  2. Убедитесь, что каждая обратная косая черта, которая создает экранирование регулярного выражения (например, \d, \\), также экранирована
  3. Поместите скобки вокруг части совпадения, которую вы хотите извлечь
  4. Используйте $1 в замене, чтобы извлечь эту часть.

Вот первое описание шаблона:

  • .* - любые символы, равные нулю или более, кроме символов разрыва строки, как можно больше
  • [/\\] - символ / или \
  • (\d{8}) - группа захвата (обозначается с помощью $1 из шаблона замены): восемь цифр
  • [\\\\/]? — необязательный символ / или \
  • $ - конец строки.
person Wiktor Stribiżew    schedule 06.03.2021

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

state = ${absolute.path:getDelimitedField(4, '/')}
date  = ${absolute.path:getDelimitedField(5, '/')}

См. Язык выражений Nifi

person Vikramsinh Shinde    schedule 08.03.2021