我正在努力创建一个与以下格式的电话号码匹配的Java正则表达式:
+49(173)46-5847
为了匹配此字符串,我使用了此正则表达式:
^(+(d+)((d+))(d+)-(d+))
当在任意位置发现括号,连字符或空格时,与字符串的长度无关,表达式如何与整个字符串(在本例中为电话号码)匹配?
以下格式不应匹配:
+49173465847
或0049173465847
谢谢!
答案 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()-]*$
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