我有电话号码清单,但想根据情况删除其中一些。我正在尝试在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)


而且我不希望数字包含以下内容:


前三个数字不应包含000或666或900或999(例如,应拒绝666-77-5948)
如果数字之间包含00,则也应拒绝该数字(例如945-00-8796)
如果数字包含任何特殊字符,例如@!#$%^()


某种正则表达式是否可能,以便我可以过滤这些记录。我已经尝试过使用子字符串功能,但是没有按预期工作。

这些号码应被拒绝:

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


有人可以帮忙吗?

最佳答案

可以使用仅指定数字和破折号的正则表达式排除特殊字符:

^\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();

关于java - 正则表达式过滤联系电话,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38841603/

10-17 00:39