如何在Plait(Racket子语言)中不使用正则验证特定格式手机号
不用正则验证Plait中的手机号格式
Plait作为Racket的子语言,确实没有原生支持正则表达式的API,我们可以通过字符串拆解+字符校验的方式实现手机号验证,完全贴合你需要的「xxx-xxx-xxxx」格式,且区号限定为787或939。
实现方案
分步骤验证手机号的所有规则:
- 检查字符串总长度是否为12(匹配
xxx-xxx-xxxx的长度) - 检查第4位和第8位是否是分隔符
- - 提取前3位作为区号,验证是否是"787"或"939"
- 验证其余所有位置的字符都是数字
完整代码
#lang plait ;; 辅助函数:检查单个字符是否是数字 (:: char-digit? (Char -> Boolean)) (define (char-digit? c) (and (char>=? c #\0) (char<=? c #\9))) ;; 辅助函数:检查字符串指定子串是否全为数字 (:: substring-all-digits? (String Number Number -> Boolean)) (define (substring-all-digits? s start end) (if (>= start end) #t (and (char-digit? (string-ref s start)) (substring-all-digits? s (+ start 1) end)))) ;; 手机号验证函数 (:: validate-phone-number (String -> Boolean)) (define (validate-phone-number phone) (and ;; 检查总长度是否为12 (= (string-length phone) 12) ;; 检查分隔符位置(Plait字符串索引从0开始) (char=? (string-ref phone 3) #\-) (char=? (string-ref phone 7) #\-) ;; 验证合法区号 (or (string=? (substring phone 0 3) "787") (string=? (substring phone 0 3) "939")) ;; 验证各段数字合法性 (substring-all-digits? phone 0 3) (substring-all-digits? phone 4 7) (substring-all-digits? phone 8 12))) ;; 测试用例 (test (validate-phone-number "787-123-4567") #t) (test (validate-phone-number "939-987-6543") #t) (test (validate-phone-number "800-123-4567") #f) (test (validate-phone-number "787-12-4567") #f) (test (validate-phone-number "787-abc-4567") #f) ;; 非数字字符测试 (test (validate-phone-number "7871234567") #f) ;; 无分隔符测试
代码说明
char-digit?:通过字符ASCII范围判断单个字符是否为0-9的数字substring-all-digits?:递归检查指定区间内的所有字符是否都是数字validate-phone-number:按顺序验证所有规则,只要一项不满足就返回#f,全部符合则返回#t- 注意Plait字符串索引从0开始,因此格式中的第4位对应索引3,第8位对应索引7
内容的提问来源于stack exchange,提问作者Jose Enrique Plaud
相关产品推荐
相关产品推荐

