我正在Impala中使用正则表达式功能在文件路径中找到文件夹名称,但似乎无法给我正确的结果
我想从此文件路径中解析出“一个”:
/this/one/path/to/hdfs
这是我使用的正则表达式:
regexp_extract(filepath,'[/]+',0)
答案 0 :(得分:1)
如果在这里我们希望捕获/
,那么我们可能只想尝试([\/]+)
。还应该有其他表达式来提取one
,例如:
(?:\/[a-z]+\/)(.+?)(?:\/.+)
,我们的代码可能类似于:
regexp_extract(filepath, '(?:\/[a-z]+\/)(.+?)(?:\/.+)', 2)
或
regexp_extract(filepath, '(?:\/.+?\/)(.+?)(?:\/.+)', 2)
在这种情况下,我们不会使用非捕获组捕获one
后面的内容:
(?:\/[a-z]+\/)
然后我们使用以下命令捕获one
:
(.+?)
最后,我们在另一个one
之后的另一个非捕获组中添加了一个右边界:
(?:\/.+)
jex.im可视化正则表达式:
根据one
可能位于的斜线,我们可以修改表达式。例如,在这种情况下,该表达式也可能有效:
(?:\/.+?\/)(.+?)(?:\/.+)
答案 1 :(得分:1)
最新的Impala版本use RE2 regex library,并且您可以使用regex_extract
function中的第三个参数轻松访问捕获组值。
使用以下正则表达式:
^/[^/]+/([^/]+)
请参见regex demo(请注意,Go regex风味也是RE2,这就是在regex101中选择此选项的原因)。匹配
^
-字符串的开头/
-一个/
字符(Impala正则表达式字符串中没有正则表达式定界符,因此无需在模式中转义/
个字符)[^/]+
-除/
以外的任何1个或多个字符/
-一个/
字符([^/]+)
-捕获组1(要获取它,必须将 index
参数设置为1
):除{以外的任何1个或多个字符{1}} 代码:
/