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})$)";
提取 $1 中的 44 个国家/地区代码(如果输入数字为 07...则为空)和 $2 中的 10 位 NSN。
但是请注意,以 070 和 076 开头的号码(07624 除外)不是手机号码。
最终图案:
NSString * regex = @"(^\\(?(?:(?:0(?:0|11)\\)?[\\s-]?\\(?|\\+)(44)\\)?[\\s-]?\\(?(?:0\\)?[\\s-]?\\(?)?|0)(7([1-5789]\\d{2}|624)\\)?[\\s-]?\\d{6}))$)";
提取 $2 中的 NSN,然后从中删除所有非数字以进行进一步处理。