Phone number regular expression

Phone number regular expression

  • ChinaMain11Mobile3Y2018Mobile
"(^((13[0-9])|(14[5,7,9])|(15[0-3,5-9])"
"|166|(17[0,1,3,5-8])|(18[0-9])|(19[8-9])))-?\\d{4}-?\\d{4}$"
  • ChinaMain11Mobile3Y2018Mobile86
"^((\\+86)|(86))?-?"
"((13[0-9])|(14[5,7,9])|(15[0-3,5-9])"
"|166|(17[0,1,3,5-8])|(18[0-9])|(19[8-9]))-?\\d{4}-?\\d{4}$"
  • ChinaMainPhone
"(^0\\d{2,3})?-?\\d{7,8}$"
  • LesserNums11Mobile
// "^\\d{11}$"

"^\\d{3}-?\\d{4}-?\\d{4}$"
  • LesserPhone
"^\\d+$"

Part of phone number validator implementation in C++

Full code and test cases see

struct PhoneNumber final {
    /**
     * Phone number specification
     * MDN号码的结构如下: CC + MAC + H0 H1 H2 H3 + ABCD 其中:
     * - 【CC】: 国家码,中国使用86。
     * - 【MAC】: 移动接入码,本网采用网号方案,为133。
     * - 【H0H1H2H3】: HLR识别码,由运营商统一分配。
     * - 【ABCD】: 移动用户号,由各HLR自行分配。
     */
    enum class Spec {
        /**
         * @sa https://baike.baidu.com/item/%E6%89%8B%E6%9C%BA%E5%8F%B7%E7%A0%81
         * 电信 联通 移动 + 2018
         * - 中国电信号段
         *   133 149 153 173 177 180 181 189 199
         * - 中国联通号段
         *   130 131 132 145 155 156 166 171 175 176 185 186
         * - 中国移动号段
         *   134(0-8) 135 136 137 138 139 147 150 151 152 157 158 159 178
         *   182 183 184 187 188 198
         *
         * - 其他号段
         *   14 号段以前为上网卡专属号段 如中国联通的是 145 中国移动的是 147 等等
         *   虚拟运营商
         *   - 电信
         *     1700 1701 1702
         *   - 联通
         *     1704 1707 1708 1709 171
         *   - 移动
         *     1703 1705 1706
         *   - 卫星通信
         *     1349
         *
         * Pattern:
         * - nnnnnnnnnnn
         * - nnn-nnnn-nnnn
         * - nnn-nnnnnnnn
         * - nnnnnnn-nnnn
         */
        ChinaMain11Mobile3Y2018Mobile   = 0,
        /**
         * Pattern:
         * - nnnnnnnnnnn
         * - nnn-nnnn-nnnn
         * - nnn-nnnnnnnn
         * - nnnnnnn-nnnn
         * - 86nnnnnnnnnnn
         * - 86-nnnnnnnnnnn
         * - 86-nnn-nnnn-nnnn
         * - 86-nnn-nnnnnnnn
         * - 86-nnn-nnnn-nnnn
         * - +86nnnnnnnnnnn
         * - +86-nnnnnnnnnnn
         * - +86-nnn-nnnn-nnnn
         * - +86-nnn-nnnnnnnn
         * - +86-nnn-nnnn-nnnn
         */
        ChinaMain11Mobile3Y2018Mobile86 = 1,
        /**
         * 区号+号码,区号以 0 开头 3 位或 4 位
         * 号码由 7 位或 8 位数字组成
         * 区号与号码之间可以无连接符 也可以 - 连接
         * Pattern:
         * - 0nnnnnnnnn
         * - 0nn-nnnnnnn
         * - 0nnnnnnnnnn
         * - 0nnn-nnnnnnn
         */
        ChinaMainPhone                  = 10,
        /**
         * Pattern:
         * - nnnnnnnnnnn
         * - nnn-nnnn-nnnn
         */
        LesserNums11Mobile               = 98,
        /**
         * Pattern: n...
         * @note remove all +/- first
         */
        LesserPhone                      = 99,
    };
    ...
};

See also