4

我有以下手机号码的正则表达式:

^(([+]|[0]{2})([\\d]{1,3})([\\s-]{0,1}))?([\\d]{10})$

有效数字是:

+123-9854875847
00123 9854875847
+123 9854875847
9878757845

如果用户输入 9 或 11 位手机号码,上述表达式将不会验证,但如果用户分别输入 9 或 11 位数字号码,+123+91它会得到验证,因为在这部分表达式中([\\d]{1,3})最后两位数字是可选的。

那么,有什么方法可以使这部分([\\s-]{0,1}))?([\\d]{10})不与这部分结合([\\d]{1,3})

4

4 回答 4

4

这个问题有点不清楚,但我想你想把号码和国家代码分开。

这很容易通过提取组来完成。group(i)i括号中的第一个东西。

我还应用了这些简化:[\\d]= \\d, {0,1}= ?, [+]= \\+, [0]{2}= 00

代码:

String regex = "^((\\+|00)(\\d{1,3})[\\s-]?)?(\\d{10})$";
String str = "+123-9854875847";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
if (m.matches())
{
   System.out.println("Country = " + m.group(3));
   System.out.println("Data = " + m.group(4));
}

输出:

Country = 123
Data = 9854875847

使用不匹配组 ( ?:) 的替代方法:(因此您可以使用group(1)and group(2)

String regex = "^(?:(?:\\+|00)(\\d{1,3})[\\s-]?)?(\\d{10})$";
String str = "+123-9854875847";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
if (m.matches())
{
   System.out.println("Country = " + m.group(1));
   System.out.println("Data = " + m.group(2));
}

参考

相关测试

于 2013-05-09T12:04:05.210 回答
1

只要分机始终与电话号码的其余部分分开,您的正则表达式就可以正常工作。如果没有这种分离,就无法正确验证电话号码。

另请记住,分机号和电话号码的长度可能因国家/地区而异,因此没有可以解决所有情况的正则表达式。如果您可以生成允许的扩展名列表,则可以将其用于正则表达式并获得更好的匹配,但对于许多任意长度的数字组,您将得到许多错误的匹配。

我已经稍微简化了你的正则表达式,所以 oyu 可以在实践中看到@Dukeling 的建议。你的正则表达式在顶部,我的在底部。

^(([+]|[0]{2})([\\d]{1,3})([\\s-]{0,1}))?([\\d]{10})$
^(  (\\+|00)    \\d{1,3}    [\\s-]?)?      \\d{10}  $
于 2013-05-09T11:44:37.127 回答
1
try {


            String mobile_number="india number +919979045000\n" +
                    "india number 9979045000\n" +
                    "china number +86 591 2123654\n" +
                    "Brazil number +55 79 2012345\n" +
                    "it is test all string get mobile number all country"+
                    "Ezipt +20 10 1234567\n" +
                    "France +33 123456789\n" +
                    "Hong Kong  +852 1234 5456\n" +
                    "Mexico +52 55 12345678"+
                    "thanks";

            Pattern p = Pattern.compile("\\(?\\+[0-9]{1,3}\\)? ?-?[0-9]{1,3} ?-?[0-9]{3,5} ?-?[0-9]{5}( ?-?[0-9]{3})? ?(\\w{1,10}\\s?\\d{1,6})?");
            List<String> numbers = new ArrayList<String>();
            //mobile_number= mobile_number.replaceAll("\\-", "");
            Matcher m = p.matcher("" + mobile_number);
            while (m.find()) {
                numbers.add(m.group());
            }

            p = Pattern.compile("\\(?\\+[0-9]{1,3}\\)? ?-?[0-9]{1,3} ?-?[0-9]{3,5} ?-?[0-9]{4}( ?-?[0-9]{3})? ?(\\w{1,10}\\s?\\d{1,6})?");
            m = p.matcher("" + mobile_number);
            while (m.find()) {
                numbers.add(m.group());
            }

            p = Pattern.compile("((?:|\\+)([0-9]{5})(?: |\\-)(0\\d|\\([0-9]{5}\\)|[1-9]{0,5}))");
            m = p.matcher("" + mobile_number);
            while (m.find()) {
                numbers.add(m.group());
            }

            p = Pattern.compile("[0-9]{10}|\\(?\\+[0-9]{1,3}\\)?-?[0-9]{3,5} ?-?[0-9]{4}?");
            m = p.matcher("" + mobile_number);
            while (m.find()) {
                numbers.add(m.group());
            }

            String numberArray=numbers.toString();
            System.out.print(""+numberArray);

            // final result 
            /* [+919979045000, +86 591 2123654, +33 123456789, +52 55 12345678, +919979045000, +86 591 2123654, +55 79 2012345, +20 10 1234567, +33 123456789, +852 1234 5456, +52 55 12345678, +919979045000, 9979045000] */


        } catch (Exception e) {
            e.printStackTrace();
        }
于 2018-02-16T05:42:04.153 回答
0

输入国家代码和手机号码两部分的最佳方式。在这种情况下,您可以使用正则表达式轻松验证它(国家代码和手机号码)。

于 2013-05-09T11:44:26.893 回答