【问题标题】:Hive Regex is acting greedyHive Regex 表现得很贪婪
【发布时间】:2021-09-08 10:37:41
【问题描述】:

我只想匹配一个字符串中的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]*'

我做错了什么?

【问题讨论】:

  • 我看不出您的正则表达式如何符合您的要求。它甚至没有#
  • 我建议阅读正则表达式语法并使用regex101 之类的工具来解释当前的正则表达式,并可能为给定的用例创建一个正确的正则表达式。
  • 如果我没看错,正则表达式看起来像[*#]*1?911[*#]*
  • 一点test case on regex101 到@shmosel 提出的解决方案(我冒昧地包括了字符串开始和字符串结束验证)。
  • 你不能不做INSTR (col, '911') 吗?你必须使用正则表达式吗?您的要求看起来很简单。

标签: java sql regex hive rlike


【解决方案1】:

顺便说一句,在 Hive 中转义时,您应该使用双反斜杠:\\* 或使用[*],以避免出现意外行为(有时单反斜杠作为转义,有时不是,双反斜杠在 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 * 使其匹配

【讨论】:

    猜你喜欢
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    相关资源
    最近更新 更多