正则表达式过滤联系号码

时间:2016-08-09 03:34:26

标签: java regex

我有一个电话号码列表,但是想要根据某些条件删除其中一些电话号码。我正在尝试在ETL中设置。

假设这是联系电话号码列表:

897-54-6212
985566655
568-00-9977
000-56-8795
875-95-9999
&^*-(&-#$@)
111-85-4568
222-56-6542
333-56-4589
444-48-8978
555-48-8978
666-58-5648
777-58-5647
888-86-8978
456-33-5685
485-44-4568
465-55-8523
485-66-7824
468-77-5948
854-88-2358
785-78-1111
588-64-2222
078-05-1120
455-56-(0000)

我不想要数字,如果它包含:

  1. 前三位数字不应包含000或666或900或999(例如666-77-5948应被拒绝)

  2. 如果数字中间包含00(例如945-00-8796),也应拒绝该号码

  3. 如果数字包含任何类型的特殊字符,例如@!#$%^()

  4. 这可能是一些正则表达式,以便我可以过滤这些记录的种类。我已尝试过使用子串函数,但这并没有按预期工作。

    这些号码应该被拒绝:

    985566655
    568-00-9977
    000-56-8795
    &^*-(&-#$@)
    666-58-5648
    455-56-(0000)
    

    有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

可以使用仅指定数字和短划线的正则表达式排除特殊字符:

^\d{3}-\d{2}-\d{4}$

如果您添加负面的lookbehinds以将某些数字列入黑名单,它将如下所示:

^\d{3}(?<!000|666|999|900)-\d{2}(?<!00)-\d{4}$

Regex101 Demo

由于您将对照列表进行匹配,因此请确保使用Pattern对象预编译正则表达式。不要在循环中使用String#matches()

import java.util.regex.Pattern;
...
Pattern phone = Pattern.compile("^\\d{3}(?<!000|666|999|900)-\\d{2}(?<!00)-\\d{4}$");
...
boolean isValid = phone.matcher(inputString).matches();