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

字符串末尾邮编验证循环逻辑问题及Progress正则表达式支持咨询

邮编验证问题解答

问题1:破折号处理导致noZip错误设为TRUE的原因及修复

你的代码核心问题是条件判断逻辑错误:

  • 原代码中IF iTemp GE 1 AND iTemp GE 5 THEN 等价于iTemp >=5,当iTemp=6(破折号所在位置)时,这个条件会触发,程序会检查该字符是否为数字。但破折号不是数字,noZip被直接设为TRUE,后续的破折号合法性检查即使通过也无法改变结果,循环直接退出。
  • 另外IF iTemp GE 7 AND iTemp GE 10 THEN 逻辑完全错误,应该是iTemp >=7 AND iTemp <=10。

修复后的代码片段

DO iTemp = 1 TO LENGTH(zipPlus4Temp):
   IF noZip EQ TRUE THEN LEAVE.
   cThisChar = SUBSTRING(zipPlus4Temp,iTemp,1).
   // 1-5位必须是数字
   IF iTemp >= 1 AND iTemp <=5 THEN
       IF NOT(fnIsNumeric(cThisChar)) THEN noZip = TRUE.
   // 第6位必须是破折号(仅针对Zip+4格式)
   ELSE IF iTemp EQ 6 THEN 
       IF NOT(fnIsDash(cThisChar)) THEN noZip = TRUE.
   // 7-10位必须是数字
   ELSE IF iTemp >=7 AND iTemp <=10 THEN 
       IF NOT(fnIsNumeric(cThisChar)) THEN noZip = TRUE. 
END.

额外补充:原代码直接截取最后10位,未考虑5位邮编的情况。建议先判断地址末尾字符:如果最后5位全是数字,则判定为合法5位邮编;如果最后10位符合NNNNN-NNNN格式,则判定为合法Zip+4邮编。

问题2:Progress的正则表达式支持情况

Progress(OpenEdge)的正则支持分版本区别:

  • OpenEdge 10及更早版本:确实没有原生正则功能,只能通过自定义字符校验函数或调用外部工具实现复杂匹配。
  • OpenEdge 11及以上版本:
    1. 提供MATCHES操作符,可实现简单模式匹配,适合邮编这类规则简单的场景:
      // 验证末尾是5位邮编
      IF location MATCHES "*[0-9][0-9][0-9][0-9][0-9]" THEN 
          MESSAGE "合法5位邮编" VIEW-AS ALERT-BOX.
      // 验证末尾是Zip+4格式
      IF location MATCHES "*[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]" THEN 
          MESSAGE "合法Zip+4邮编" VIEW-AS ALERT-BOX.
      
    2. 可调用.NET的System.Text.RegularExpressions.Regex类实现复杂正则匹配,示例:
      USING System.Text.RegularExpressions.Regex FROM ASSEMBLY.
      
      DEF VAR oRegex AS Regex NO-UNDO.
      DEF VAR isValidZip AS LOGICAL NO-UNDO.
      
      // 匹配字符串末尾的5位或Zip+4邮编
      oRegex = NEW Regex("\d{5}(-\d{4})?$").
      isValidZip = oRegex:IsMatch(location).
      
      MESSAGE SUBSTITUTE("地址邮编是否合法:&1", isValidZip) VIEW-AS ALERT-BOX.
      

内容的提问来源于stack exchange,提问作者Felice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:39:40