正则表达式 - 正好匹配10个数字,至少有一个符号或它们之间的空格

时间:2016-10-26 09:30:20

标签: sql regex oracle

我试图在oracle sql中编写一个查询,以获取具有无效10位数字的行,即其中包含其他符号。

例如:

(111) 111-1111       #10 digit number with some symbols and spaces in between
111-111-1111         
(111)111-1111
111)111-1111
(111) 11    1-1111

即它应该匹配10个非连续的数字,因为它中有一些符号。

所以它不应该与以下示例匹配:

111          #consecutive 3 digit number
11   1       #3 digit number with spaces
11-1         #3 digit number with symbol in between
1111111111   #consective 10 digit number

我正在使用REGEXP_LIKE,类似这样的

select * from table where REGEXP_LIKE(column, ?)

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用正则表达式和length的组合;后者在没有其他字符的情况下排除纯10位数字:

regexp_like(col, '^[ .()-]*(\d[ .()-]*){10}$') and length(col) > 10

[.()-]课程中,您将列出您在数字中允许作为符号的所有字符。请注意,-必须是该列表中的最后一个,否则将被转义。

如果您允许在10位数之间出现任何非数字,您可以使用\D

regexp_like(col, '^\D*(\d\D*){10}$') and length(col) > 10

答案 1 :(得分:1)

所以:字符串的长度应大于10,并且总的位数必须精确为10.这可以在没有正则表达式的情况下完成(这应该使它更快):

... where length(str) > 10 and
          length(str) = 10 + length(translate(str, 'z0123456789', 'z'))

translate会将字母z翻译为自身,将所有其他字符(数字)翻译为空。必须包含z是令人讨厌的,但不可避免;如果任何参数为NULL,translate将返回NULL。第二个条件是输入str的长度恰好比删除所有数字的字符串长度多10个 - 因此恰好有10个数字。