正则表达式就像 Hive 上没有前缀的电话号码 (+01)

Regex like telephone number on Hive without prefix (+01)

我们在配置单元上遇到正则表达式问题。 我们需要排除记录开头带有 +370037 的数字(这可能是正则表达式上的错误结果)并且没有字母或 space.

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

编辑:我们希望它从 select 出来是真(正确的数字)或假。

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

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

Hive 中的 + 等特殊字符和 \d 等字符 类 应使用双斜杠进行转义:\+\d.

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

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

模式应该是这样的:

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

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

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

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

  3. 之后是一个未定义长度(至少一个)的数字序列,直到字符串结束:\d+$

把所有东西放在一起:

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

你可以在这里玩这个正则表达式,看看它是否符合你的需要:https://regex101.com/r/KK5rjE/3

注意:正如leftjoin所指出的:要在配置单元中使用此正则表达式,您可能需要另外转义模式中的反斜杠\

您可以使用

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

参见regex demo。详情:

  • ^ - 字符串开头
  • (?!\+37|0037) - 如果 +370037 紧邻当前位置
  • 的右侧,则匹配失败的否定前瞻
  • \+? - 一个可选的 + 符号
  • \d+ - 一位或多位数字
  • $ - 字符串结尾。