英文:
Regex to allow space between numbers or nothing before the first one
问题
我有以下方法 - 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_thenReturnInvalidPhones() {
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);
}
英文:
I have the method that follows - verifyPhones
, I am using two regexs on it.
The first one is to identify if the String is valid, if not I need to search which numbers are not valid.
My problem is when I have two valid numbers together - 20255501252025550125
, the system is returning only one of them as wrong instead of the whole string.
How can I improve my regex to have achieve that?
Thanks in advance.
Definition of valid number:
Any number that have 9 numbers, separated or not by the char -
Example:
> 000-000-0000
> 0001110000
Here is my code:
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);
}
答案1
得分: 0
这是我的建议:
如果有效的数字必须彼此之间用空格分隔,那么你可以首先通过空格将字符串分割成多个片段,其中每个片段都将是一个数字。然后在每个片段上单独应用验证模式。不符合模式的片段将是无效的数字。
以下是一个示例:
private static final Pattern phonePattern = Pattern.compile("(\\d{3}[-]?){2}\\d{4}");
public static List<String> verifyPhones(String phones) {
String[] numbers = phones.split("\\s+");
List<String> wrongPhones = new ArrayList<>();
for (String number : numbers) {
if (!phonePattern.matcher(number).matches()) {
wrongPhones.add(number);
}
}
return wrongPhones;
}
注意:我已经更改了方法的签名。现在它返回一个包含错误数字的List
。你并不总是期望只有一个无效的数字,对吧?
英文:
Here's what I suggest:
If valid numbers have to be separated by a space from each other, then you can first split the String by spaces into pieces, where each piece is going to be a number. And then apply validation pattern on each piece separately. Those pieces that do not match the pattern are going to be invalid numbers.
Here's an example:
private static final Pattern phonePattern = Pattern.compile("(\\d{3}[-]?){2}\\d{4}");
public static List<String> verifyPhones(String phones) {
String[] numbers = phones.split("\\s+");
List<String> wrongPhones = new ArrayList<>();
for (String number : numbers) {
if (!phonePattern.matcher(number).matches()) {
wrongPhones.add(number);
}
}
return wrongPhones;
}
Note: I've changed the method's signature. Now it returns a List
of wrong numbers. You do not expect to always have only one invalid number, do you?
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论