【发布时间】:2021-01-11 03:22:30
【问题描述】:
我有下面的方法 - verifyPhones,我在上面使用了两个正则表达式。
第一个是识别字符串是否有效,如果不是我需要搜索哪些数字是无效的。
我的问题是当我有两个有效数字在一起时 - 20255501252025550125,系统只返回其中一个错误而不是整个字符串。
如何改进我的正则表达式以实现这一目标?
提前致谢。
有效号码的定义:
任何有 9 个数字的数字,由字符 - 分隔或不分隔
示例:
000-000-0000
0001110000
这是我的代码:
public static String verifyPhones(String phones) {
Pattern patternValidAllPhones = Pattern.compile("^(((\\d{3}[-]?){2}\\d{4})[ ]+)+$");
Pattern patternToFindWrongPhones = Pattern.compile("([ ]+((\\d{3}[-]?){2}\\d{4})[ ]+)");
phones = phones.replaceAll("\\r", " ").replaceAll("\\n", " ").concat(" ");
Matcher matcherValidAllPhones = patternValidAllPhones.matcher(phones);
if(!matcherValidAllPhones.matches()) {
Matcher matcherToFindWrongPhones = patternToFindWrongPhones.matcher(phones);
return matcherToFindWrongPhones.replaceAll("").trim();
}
return "";
}
@Test
public void verifyPhonesTest_whenInvalidPhones_thenReturneInvalidPhones() {
String invalidPhones1 = "202-555*0125 202-555-0125 202-555-0125 202-555-0125";
String invalidPhones2 = "202-555-0125202-555-0125 202-555-0125 202-555-0125";
String invalidPhones3 = "202555*0125 202-555-0125 202-555-0125 202-555-0125";
String invalidPhones4 = "2025550125 20255501252025550125";
String result1 = PhonesService.verifyPhones(invalidPhones1);
String result2 = PhonesService.verifyPhones(invalidPhones2);
String result3 = PhonesService.verifyPhones(invalidPhones3);
String result4 = PhonesService.verifyPhones(invalidPhones4);
assertFalse(result1.isEmpty());
assertEquals("202-555*0125", result1);
assertFalse(result2.isEmpty());
assertEquals("202-555-0125202-555-0125", result2);
assertFalse(result3.isEmpty());
assertEquals("202555*0125", result3);
assertFalse(result4.isEmpty());
assertEquals("20255501252025550125", result4);
}
【问题讨论】:
-
“有效电话”的定义是什么?
-
9 个数字是否被分隔 - 示例:111-111-1111 0005559999 ,但它们与空格或换行符组合在一起示例:111-111-1111 0005559999 111-111-1111\\n111 -111-1111 Obs.:换行符,我在之前删除并替换空间。
-
正如我所见,在有效字符串的情况下,其中的数字必须用空格相互隔开,这是真的吗?
-
是的。如果它带有除数字之间的空格之外的其他内容,则它是无效的。因此,我在验证之前将 \\n 替换为空格。