Regex для извлечения части пути к файлу - PullRequest
2 голосов
/ 26 мая 2019

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

Я хочу разобрать "один" из этого пути к файлу:

/this/one/path/to/hdfs

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

regexp_extract(filepath,'[/]+',0)

Ответы [ 2 ]

2 голосов
/ 26 мая 2019

Если здесь мы хотим захватить /, то мы можем просто попробовать ([\/]+).Должны быть и другие выражения для извлечения one, такие как:

(?:\/[a-z]+\/)(.+?)(?:\/.+)

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

regexp_extract(filepath, '(?:\/[a-z]+\/)(.+?)(?:\/.+)', 2)

или

regexp_extract(filepath, '(?:\/.+?\/)(.+?)(?:\/.+)', 2)

Отсеки

В этом случае мы не собираем то, что стоит за one, используя группу без захвата:

(?:\/[a-z]+\/)

, затем мы фиксируем one, используя:

(.+?)

и, наконец, мы добавляем правую границу после one в другой группе без захвата:

(?:\/.+)

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here

DEMO

В зависимости от того, какая косая черта может находиться oneМы можем изменить наше выражение.Например, в этом случае это выражение также может работать:

(?:\/.+?\/)(.+?)(?:\/.+)

DEMO

1 голос
/ 03 июня 2019

Последние версии Impala используют библиотеку регулярных выражений RE2 , и вы можете легко получить доступ к групповым значениям захвата, используя третий аргумент в функции regex_extract .

Использованиеследующее регулярное выражение:

^/[^/]+/([^/]+)

См. демонстрационную версию regex (обратите внимание, что разновидность Go regex также RE2, поэтому этот параметр выбран в regex101).Он соответствует

  • ^ - начало строки
  • / - символ / (без разделителей регулярных выражений в строке регулярных выражений Impala, следовательно, нет необходимости экранировать /символы в шаблоне)
  • [^/]+ - любой 1 или более символов, отличных от /
  • / - / char
  • ([^/]+) -Группа захвата 1 (чтобы получить ее, аргумент index должен быть установлен в 1): любой 1 или более символов, кроме /

Код:

regexp_extract(filepath, '^/[^/]+/([^/]+)', 1)
...