Я пытаюсь проверить номера телефонов Великобритании, которые находятся в формате:
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*$
Кто-нибудь знает, почему это?
Вам не хватает закрывающей квадратной скобки
^\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);