sql - Impala Regex 前瞻和后视的解决方法
问题描述
如果我使用 Hive,则以下工作正常。但是如果我使用 Impala,它会抛出错误:
select regexp_replace("foobarbarfoo","bar(?=bar)","<NA>");
WARNINGS: Could not compile regexp pattern: bar(?=bar)
Error: invalid perl operator: (?=
基本上,Impala 不支持lookahead 和lookbehind
今天有解决方法吗?也许使用UDF?
谢谢。
解决方案
由于您正在使用regexp_replace
,匹配并捕获您想要保留的字符串部分(但想要用作必须具有的上下文)并替换为反向引用。请参阅regexp_replace
Impala 参考:
这些示例展示了如何使用替换文本替换与模式匹配的部分字符串,其中可以包括
()
对模式字符串中任何组的反向引用。反向引用编号从 1 开始,任何\
字符都必须转义为\\
.
所以,在这里,你可以使用
select regexp_replace("foobarbarfoo","bar(bar)","<NA>\\1");
^ ^ ^^^
请注意,它不能替换连续的匹配项,但是,它将在当前场景中工作并且foobarbarfoo
会变成foo<NA>barfoo
(请注意,Go 正则表达式引擎也是 RE2,因此在 regex101.com 上选择了此选项)。
推荐阅读
- docker - 与 docker 1.7.0 一起使用的 docker-compose 的确切版本是什么?
- dialogflow-es - 在对话流中从一个意图重定向到另一个意图
- android - 广播接收器在 Android 中不起作用
- python - 用数据集中正确的国家名称替换错误的国家名称
- reactjs - 带有 cookie 的 HOC 私有路由上的 nextjs 9.4 错误
- reactjs - Moment js,React:月份渲染问题
- java - spring data mongo db自定义查询问题
- android - 我只想在 Android 4.4 中使用 C++11 库
- jenkins - Jenkins - 从 Slack 触发构建时收到“失败并显示错误 invalid_url”消息
- javascript - ReferenceError: $ 未在 Vscode 编辑器中定义