正则表达式不跟踪空格

时间:2016-03-16 16:48:41

标签: java regex

我需要验证电话号码。它不是针对任何国家的,这是我的要求。

我的要求:

  1. 电话号码不是强制性的(可以留空,不填写)
  2. 不应在ex:12 123
  3. 之间包含空格
  4. 不应该用白色空格填充
  5. 我可以使用以下代码满足前两个条件。第三个我不能陷入正则表达式。

    我有以下代码:

        final String regEx = "^[^\\s][-+()0-9]{1,20}$";
    
        if (phoneNumber1 != null && !StringUtils.isEmpty(phoneNumber1) && (!phoneNumber1.matches(regEx)))
        {
            //error message
        }
    

    你可以帮我跟踪它是否包含空格吗?

3 个答案:

答案 0 :(得分:0)

捕获两个非捕获组之间的选择。第一个是由非捕获组^$包围的空字符串(?:^$)。然后是第二个非捕获组|中的交替运算符(?:\d+)和至少一个数字(\ d +)。所有捕获的结果都是:

((?:^$)|(?:\d+))

查看详细说明:Regex101

在Java中,它看起来像这样:

String s[] = {"123456", "", "123 456"};
for (int i=0; i<s.length; i++) {
     System.out.println(s[i].matches("((?:^$)|(?:\\d+))"));
}
  

真   真正   假

答案 1 :(得分:0)

如果最大值为20位,您可以尝试:

 String[] phoneNumbers = new String[]{"", "          ", "123 456", "123456"};
 for (String p: phoneNumbers){
     System.out.println( p.matches("^[0-9]{0,20}$") + " => " + p);
 }

输出:

true =>           //blank phone number
false =>          //phone number completely filled with white spaces         
false => 123 456
true => 123456

答案 2 :(得分:0)

在这种情况下,我会为所有空格创建一个正则表达式(例如&#34; \ s +&#34;)并检查它是否匹配。尝试为所有这些事情找出一个正则表达式可能会很有趣,但没有什么需要,并且通过保持简单来节省大量时间。

另一方面,我讨厌将这样的规则放在电话号码上。只删除所有非数字字符。为什么要关心用户是否输入语义上不重要的格式?这对用户来说真的很有帮助,可以避免拼写错误。