2

我们在 hive 上的正则表达式有问题。我们需要排除带有+370037在记录开头的数字(这可能是正则表达式上的错误结果)并且没有字母或空格。

我们正在尝试这个: regexp_like(tel_number,'^\+37|^0037+[a-zA-ZÀÈÌÒÙ ]') 但它不起作用。

编辑:我们希望它从选择中出来为真(正确的数字)或假。

4

3 回答 3

1

要排除以 +01 0r +001 或 +0001 开头并且只有数字而没有空格或字母的数字:

... WHERE tel_number NOT rlike '^\\+0{1,3}1\\d+$'

像 Hive 这样的特殊字符+和像 Hive 这样的字符类\d应该使用双斜杠转义:\\+\\d.

于 2021-07-16T09:21:33.963 回答
1

一般的问题是,如果您想在您的正则表达式中描述一个格式错误的电话号码并排除与该模式匹配的所有内容,或者您​​是否想描述一个格式正确的电话号码并包含与该模式匹配的所有内容。

走哪条路,取决于你的情况。根据我对您的要求的了解,将“不以0037+37”作为条件添加到格式良好的电话号码可能是一个好方法。

模式将是这样的:

  1. 您的号码可以以+或开头00^(\+|00)

  2. 它后面不能跟 37 ,在正则表达式中可以用以下一组替代方案表示:

    一种。首先是 3,然后是除 7 之外的任何内容:3[0-689]

    湾。它后面首先是除 3 以外的任何数字,然后是任何数字:[0-24-9]\d

  3. 在那之后,直到字符串的末尾有一系列未定义长度(至少一个)的数字:\d+$

把所有东西放在一起:

^(\+|00)(3[0-689]|[0-24-9]\d)\d+$

您可以在此处使用此正则表达式,看看这是否符合您的需求:https ://regex101.com/r/KK5rjE/3

注意:正如leftjoin指出的那样:要在 hive 中使用此正则表达式,您可能需要另外转义\模式中的反斜杠。

于 2021-07-16T10:00:32.080 回答
1

您可以使用

regexp_like(tel_number,'^(?!\\+37|0037)\\+?\\d+$')

请参阅正则表达式演示。细节:

  • ^- 字符串的开始
  • (?!\+37|0037)- 如果当前位置位于+370037紧邻当前位置右侧,则匹配失败的负前瞻
  • \+?- 一个可选的+标志
  • \d+- 一位或多位数字
  • $- 字符串结束。
于 2021-07-16T13:36:34.383 回答