Вы можете использовать эти два вида просмотра вперед, чтобы убедиться, что у вас есть круглые скобки с одной или несколькими цифрами внутри (?=\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