You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Plait(Racket子语言)中不使用正则验证特定格式手机号

不用正则验证Plait中的手机号格式

Plait作为Racket的子语言,确实没有原生支持正则表达式的API,我们可以通过字符串拆解+字符校验的方式实现手机号验证,完全贴合你需要的「xxx-xxx-xxxx」格式,且区号限定为787或939。

实现方案

分步骤验证手机号的所有规则:

  1. 检查字符串总长度是否为12(匹配xxx-xxx-xxxx的长度)
  2. 检查第4位和第8位是否是分隔符-
  3. 提取前3位作为区号,验证是否是"787"或"939"
  4. 验证其余所有位置的字符都是数字

完整代码

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:23:12