regex для всех номеров телефонов Великобритании

Я пытаюсь проверить номера телефонов Великобритании, которые находятся в формате:

01234 567890 01234567890 02012345678 020 1234 5678 

У меня есть следующее регулярное выражение, которое работает для всех, кроме 020 1234 5678

^\s*\(?(020[7,8]{1}\)?[ ]?[1-9]{1}[0-9{2}[ ]?[0-9]{4})|(0[1-8]{1}[0-9]{3}\)?[ ]?[1-9]{1}[0-9]{2}[ ]?[0-9]{3})\s*$

Кто-нибудь знает, почему это?

Solutions Collecting From Web of "regex для всех номеров телефонов Великобритании"

Вам не хватает закрывающей квадратной скобки

 ^\s*\(?(020[7,8]{1}\)?[ ]?[1-9]{1}[0-9{2}[ ]?[0-9]{4})|(0[1-8]{1}[0-9]{3}\)?[ ]?[1-9]{1}[0-9]{2}[ ]?[0-9]{3})\s*$ ^ here 

Это должно работать

 ^\s*\(?(020[7,8]{1}\)?[ ]?[1-9]{1}[0-9]{2}[ ]?[0-9]{4})|(0[1-8]{1}[0-9]{3}\)?[ ]?[1-9]{1}[0-9]{2}[ ]?[0-9]{3})\s*$ 

Далее вы можете удалить некоторые вещи из своего выражения.

{1} не нужен, каждый символ по-прежнему сопоставляется один раз

[ ] также не требуется, просто замените его пробелом

[8,9] неверно. он будет соответствовать 8, 9 и. Используйте [89] правильно.

Тогда это будет выглядеть так

 ^\s*\(?(020[78]\)? ?[1-9][0-9]{2} ?[0-9]{4})|(0[1-8][0-9]{3}\)? ?[1-9][0-9]{2} ?[0-9]{3})\s*$ 

Если вы хотите разрешить этот не сопоставленный шаблон 020 1234 5678, вы можете сделать, например

 ^\s*\(?(020[78]?\)? ?[1-9][0-9]{2,3} ?[0-9]{4})$|^(0[1-8][0-9]{3}\)? ?[1-9][0-9]{2} ?[0-9]{3})\s*$ ^ ^^ made the [78] optional allows no 2 or 3 of `[0-9]` 

См. Здесь, в Regexr

Я не знаю, действительно ли это телефонный номер в Великобритании!

Я исправил здесь еще одну ошибку в регулярном выражении отсутствующий $ before и отсутствующий ^ после трубы |

Если вы можете использовать Perl Number :: Phone :: UK, можете проверить, действительно ли число, выделенное, мобильное, личное или бизнес … и так далее.

020 Не следует с 7 или 8.

Лондонский телефонный код был унифицирован в один код зоны. 020 . Остальные номера являются стационарным, поэтому формат 020 7123 4567 является правильным. См. Веб-сайт ofcom .

020 должно сопровождаться 7 или 8, а во второй группе допустимы только 3 цифры.

@stema – (020) 3xxx xxxx также действует для Лондона; как и 020 0xxx xxxx и 020 1xxx xxxx. Последние – это номера «NDO».

Мое решение JS

 var total = 0; var passed = 0; var failed = 0; var r = /^(?:(?:\(?(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?(?:\(?0\)?[\s-]?)?)|(?:\(?0))(?:(?:\d{5}\)?[\s-]?\d{4,5})|(?:\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3}))|(?:\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4})|(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}))(?:[\s-]?(?:x|ext\.?|\#)\d{3,4})?$/; var pass = [ '(0123) 456 7890', '012 3456 7890', '+44 12345 67890', '+44 1234567890', '0044 1234 567 890', '0044 1234 567890', ]; pass.each ( function (value) { var result = r.test( value ); console.log( value, (result == true ? 'ok' : 'failed') ); total ++; if ( result == true ) { passed ++; } else { failed ++; } } ); var fail = [ '(0123) 456 78', '012 3456 789', '+44 12345 678', '0044 1234 567 89', ]; fail.each ( function (value) { var result = r.test( value ); console.log( value, (result == false ? 'ok' : 'failed') ); total ++; if ( result == false ) { passed ++; } else { failed ++; } } ); setTimeout(function () { console.log( "PASSED " + passed + ' / ' + total ); }, 500);