正则表达式可在任何位置匹配包含()-的电话号码

时间:2019-01-30 12:03:05

标签: java regex

我正在努力创建一个与以下格式的电话号码匹配的Java正则表达式:

+49(173)46-5847

为了匹配此字符串,我使用了此正则表达式:

^(+(d+)((d+))(d+)-(d+))

当在任意位置发现括号,连字符或空格时,与字符串的长度无关,表达式如何与整个字符串(在本例中为电话号码)匹配?

以下格式不应匹配:

+491734658470049173465847

谢谢!

3 个答案:

答案 0 :(得分:1)

为此,您可能需要更强大的匹配算法。大概你不想允许这样的比赛

+49)4(5321)3595)259((

但是您的描述中没有阻止它的内容(“在任何位置都有括号,连字符或空格”)。要排除这样的解决方案,您需要跟踪是否在给定的字符索引处是否位于括号表达式中(是否已经传递了'('字符),如果是,则不允许更多'('字符,直到看到')'。

这需要跟踪特定的状态,而仅使用正则表达式是不可能的。

答案 1 :(得分:0)

请尝试以下操作: ^(+)(((() \ d ())(-)((((()+ \ d +())+(-)< / em>))+(\ d)(((() \ d *())(-))*

希望这会有所帮助。

答案 2 :(得分:0)

您可以使用这两个前瞻来确保,(?=\d.*\(\d+\))中有一个括号,其中有一个或多个数字,而另一个前瞻性是为了确保您是否连字符,那么它们仅在两位数字之间,而没有在连字符之间在(?=.*\d(-\d+)*$)的末尾。然后使用此允许的字符集[\d()-]*收集所有数据。您需要使用的正则表达式如下,

^\+?(?=\d.*\(\d+\))(?=.*\d(-\d+)*$)[\d()-]*$

Demo

Java代码

List<String> list = Arrays.asList("+49(173)46-5847", "+49173465847", "0049173465847", "+49-(173)-(465)-847",
        "+49-(173)465-8471", "49-(173)465-8471", "+49-(173)465-8471", "+-49-(173)465-8471",
        "+49-(173)465-8471-");
Pattern p = Pattern.compile("^\\+?(?=\\d.*\\(\\d+\\))(?=.*\\d(-\\d+)*$)[\\d()-]*$");
list.forEach(x -> System.out.println(
        x + " --> " + ((Pattern.matches("^\\+?(?=\\d.*\\(\\d+\\))(?=.*\\d(-\\d+)*$)[\\d()-]*$", x)) ? "Is Valid"
                : "Is Not Valid")));

打印

+49(173)46-5847 --> Is Valid
+49173465847 --> Is Not Valid
0049173465847 --> Is Not Valid
+49-(173)-(465)-847 --> Is Valid
+49-(173)465-8471 --> Is Valid
49-(173)465-8471 --> Is Valid
+49-(173)465-8471 --> Is Valid
+-49-(173)465-8471 --> Is Not Valid
+49-(173)465-8471- --> Is Not Valid