Regex для сопоставления телефонных номеров, которые содержат () - в любой позиции - PullRequest
0 голосов
/ 30 января 2019

Я изо всех сил пытаюсь создать регулярное выражение Java, которое соответствует номерам телефонов в следующем формате:

+49(173)46-5847

Чтобы соответствовать этой строке, я использовал это регулярное выражение:

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

Как должно выглядеть выражение, которое соответствует всей строке (в данном случае телефонному номеру), когда круглые скобки, дефисы или пробелы находятся в любой позиции, независимо от длины строки?

Следующие форматы не должны совпадать:

+49173465847 или 0049173465847

Спасибо!

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Попробуйте, пожалуйста: ^ (+) ((() \ d ()) (-) ) (((() + \ d + ())+ (-) )) + (\ d) ((() \ d * ()) (-) ) *

Надеюсь, это поможет.

0 голосов
/ 30 января 2019

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

Для этого может потребоваться более надежный алгоритм сопоставления.Предположительно, вы не хотите разрешать совпадения типа

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

Но в вашем описании нет ничего, что препятствовало бы этому («круглые скобки, дефисы или пробелы находятся в любой позиции»).Чтобы исключить подобные решения, вам необходимо следить за тем, находитесь ли вы в выражении в скобках с указанным индексом символа (независимо от того, передали ли вы уже символ «(») и, если это так, запретить какие-либобольше символов '(', пока вы не увидите ')'.

Это требует отслеживания определенного состояния , что невозможно только с помощью регулярного выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...