问题描述
我们在 hive 上的正则表达式有问题。
我们需要排除记录开头带有 +37
或 0037
的数字(这可能是正则表达式的错误结果,例如)并且没有字母或空格。
我们正在尝试这个:
regexp_like(tel_number,'^\+37|^0037+[a-zA-ZÀÈÌÒÙ ]')
但它不起作用。
编辑:我们希望它从选择中出来为真(正确的数字)或假。
解决方法
要排除以 +01 0r +001 或 +0001 开头并且只有数字而没有空格或字母的数字:
... WHERE tel_number NOT rlike '^\\+0{1,3}1\\d+$'
Hive 中的 +
等特殊字符和 \d
等字符类应使用双斜杠转义:\\+
和 \\d
。
一般问题是,如果您想在正则表达式中描述格式错误的电话号码并排除与该模式匹配的所有内容,或者如果您想描述格式正确的电话号码并且包括与模式匹配的所有内容。
走哪条路,取决于您的情况。根据我对您的要求的理解,将“不以 0037
或 +37
开头”作为条件添加到格式正确的电话号码中可能是一个不错的方法。
模式应该是这样的:
-
您的号码可以以
+
或00
开头:^(\+|00)
-
它后面不能跟一个 37,它在正则表达式中可以用下面的一组替代表示:
一个。它首先是 3,然后是 7 以外的任何字符:
3[0-689]
B.紧跟其后的是除 3 之外的任何数字,然后是任何数字:
[0-24-9]\d
-
之后是一串未定义长度的数字(至少一个),直到字符串的末尾:
\d+$
把所有东西放在一起:
^(\+|00)(3[0-689]|[0-24-9]\d)\d+$
您可以在此处使用此正则表达式,看看它是否符合您的需求:https://regex101.com/r/KK5rjE/3
注意:正如 leftjoin 指出的那样:要在 hive 中使用此正则表达式,您可能需要另外转义模式中的反斜杠 \
。
你可以使用
regexp_like(tel_number,'^(?!\\+37|0037)\\+?\\d+$')
参见regex demo。详情:
-
^
- 字符串的开始 -
(?!\+37|0037)
- 如果当前位置的右侧有+37
或0037
则匹配失败的负前瞻 -
\+?
- 可选的+
符号 -
\d+
- 一位或多位数字 -
$
- 字符串结束。