NSString * regex = @"((07|00447|004407|\\+4407|\\+447)\\d{9})";
Найдя один раз ведущий 0 или ведущий +44, зачем искать его снова?
Базовое упрощение приводит к
NSString * regex = @"((07|00440?7|\\+440?7)\\d{9})";
, а затем к
NSString * regex = @"((07|(00|\\+)440?7)\\d{9})";
затем на
NSString * regex = @"((0|(00|\\+)440?)7\\d{9})";
, но 00 - не единственный общий префикс набора, 011 используется в США и Канаде.
Добавление этого и изменение порядка,дает:
NSString * regex = @"(^((0(0|11)|\\+)440?|0)7\\d{9}$)";
или предпочтительно
NSString * regex = @"(^(?:(?:0(?:0|11)|\\+)(44)0?|0)(7\\d{9}$))";
с разрешением 00447, 011447, +447, 004407, 0114407, +4407, 07 в начале и с группами без захвата.
Для более широкого соответствия входного формата, допускающего различные знаки препинания (дефисы, скобки, пробелы), используйте
NSString * regex = @"(^\\(?(?:(?:0(?:0|11)\\)?[\\s-]?\\(?|\\+)(44)\\)?[\\s-]?\\(?(?:0\\)?[\\s-]?\\(?)?|0)(7\\d{9})$)";
Извлечение 44 кода страны в $ 1 (ноль, если число введено как 07 ...) и10-значный NSN в $ 2.
Однако учтите, что числа, начинающиеся с 070 и 076 (кроме 07624), НЕ являются мобильными номерами.
Окончательный шаблон:
NSString * regex = @"(^\\(?(?:(?:0(?:0|11)\\)?[\\s-]?\\(?|\\+)(44)\\)?[\\s-]?\\(?(?:0\\)?[\\s-]?\\(?)?|0)(7([1-5789]\\d{2}|624)\\)?[\\s-]?\\d{6}))$)";
Извлеките NSN в $ 2, затем удалите из него все нецифровые символы для дальнейшей обработки.