微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Hive Regex 表现得很贪婪

如何解决Hive Regex 表现得很贪婪

我只想匹配一个字符串中的 9111911,其中包含任意数量的前置或结尾 *#

我的正则表达式:

[^0-9]\*[1-9]{3,4}[^0-9]*

当我期望它为假时,下面的测试代码返回真:

select Digits
from (select '*11911#' as Digits) A
where Digits rlike '[^0-9]\*[1-9]{3,4}[^0-9]*'

我做错了什么?

解决方法

顺便说一句,在 Hive 中转义时,您应该使用双反斜杠:\\* 或使用 [*],以避免出现不可预测的行为(有时单反斜杠用作转义,有时则不是,双反斜杠始终用作转义)在蜂巢中)。

'[^0-9]\\*[1-9]{3,4}[^0-9]*' - 不匹配,* 正确转义并且字符串中 * 之前没有任何内容。

让我们删除 \\* 之前的 [^0-9] 并再次检查:

这不返回任何行:

select Digits
from (select '*11911#' as Digits) A
where Digits rlike '\\*[1-9]{3,4}[^0-9]'

还有这个 '\\*[1-9]{3,4}[^0-9]+' 不匹配

这匹配:

'\\*[1-9]{3,4}[^0-9]*' 

因为末尾的 * 表示 0 次或多次,所以它完美匹配:一行中有 4 个 [1-9] 和 0 个非数字。

在 regex101 上它的工作原理是一样的:last * 使它匹配

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。