【问题标题】:Regex to allow space between numbers or nothing before the first one正则表达式允许数字之间有空格或在第一个之前没有空格
【发布时间】: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 替换为空格。

标签: java regex spring


【解决方案1】:

这是我的建议:

如果有效数字之间必须用空格分隔,那么您可以先将字符串按空格分割成多个片段,其中每个片段都是一个数字。然后分别在每个部分上应用验证模式。那些与模式不匹配的部分将是无效的数字。

这是一个例子:

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。您不希望总是只有一个无效号码,是吗?

【讨论】:

  • 不,我可以拥有多个,这样更好。谢谢,我被困在正则表达式中,没有看到其他解决方案。
猜你喜欢
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
相关资源
最近更新 更多