字符串末尾邮编验证循环逻辑问题及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及以上版本:
- 提供
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. - 可调用.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
相关产品推荐
相关产品推荐

