如何解决Hive Regex 表现得很贪婪
我只想匹配一个字符串中的 911
或 1911
,其中包含任意数量的前置或结尾 *
或 #
。
我的正则表达式:
[^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 举报,一经查实,本站将立刻删除。