用于提取部分文件路径的正则表达式

Regex for extracting part of a file path

我在 Impala 中使用正则表达式函数来查找文件路径中的文件夹名称,但它似乎没有给我正确的结果

我想从这个文件路径中解析出 "one":

/this/one/path/to/hdfs

这是我使用的正则表达式:

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

如果在这里我们想捕获/,那么我们可能只想尝试([\/]+)。应该还有其他表达式也可以提取one,例如:

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

我们的代码可能如下所示:

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

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

隔间

在这种情况下,我们不会使用 non-capturing 组捕获 one 背后的内容:

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

然后我们捕获 one 使用:

(.+?)

最后我们在另一个 non-capturing 组的 one 之后添加右边界:

(?:\/.+)

正则表达式电路

jex.im 可视化正则表达式:

DEMO

根据 one 所在的斜线,我们可以修改表达式。例如,在这种情况下,这个表达式也可能有效:

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

DEMO

最新 Impala 版本 use RE2 regex library, and you may easily access capturing group values using the third argument in the regex_extract function

使用以下正则表达式:

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

参见 regex demo(注意 Go regex flavor 也是 RE2,这就是为什么在 regex101 选择这个选项)。它匹配

  • ^ - 字符串开头
  • / - 一个 / 字符(Impala 正则表达式字符串中没有正则表达式定界符,因此无需转义模式中的 / 个字符)
  • [^/]+ - /
  • 以外的任何 1 个或多个字符
  • / - 一个 / 字符
  • ([^/]+) - 捕获组 1(要获取它,index 参数必须设置为 1):任何 1 或/
  • 以外的更多字符

代码:

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