也许您可以尝试类似(Pick R83 style)
OK = X MATCH "2N1X2N1X2N" AND X[3,1]=X[6,1] AND INDEX(":/-",X[3,1],1) > 0
其中变量 X 是一些输入字符串,例如:12-34-56
如果验证通过,应将变量 OK 设置为 1,否则为任何无效格式的 0。
这似乎将您所需的所有验证都集中到一个语句中。我假设非数字字符必须相同。如果这不是真的,检查可以更改为:
OK = X MATCH "2N1X2N1X2N" AND INDEX(":/-",X[3,1],1) > 0 AND INDEX(":/-",X[6,1],1) > 0
好吧,我想周围角色的要求对我来说并不明显。尽管如此,它并没有使它变得更加困难。您只需要“解析”字符串,在输入字符串中寻找第一个(我假设)这样的模式(如果有的话)。这可以在几行代码中完成。这是一个(相当未经测试的)R83 风格的测试程序:
PROMPT ":"
LOOP
LOOP
CRT 'Enter test string':
INPUT S
WHILE S # "" AND LEN(S) < 8 DO
CRT "Invalid input! Hit RETURN to exit, or enter a string with >= 8 chars!"
REPEAT
UNTIL S = "" DO
*
* Look for 1st occurrence of pattern in string..
CARDNUM = ""
FOR I = 1 TO LEN(S)-7 WHILE CARDNUM = ""
IF S[I,8] MATCH "2N1X2N1X2N" THEN
IF INDEX(":/-",S[I+2,1],1) > 0 AND INDEX(":/-",S[I+5,1],1) > 0 THEN
CARDNUM = S[I,8] ;* Found it!
END ELSE I = I + 8
END
NEXT I
*
CRT CARDNUM
REPEAT
这里只有 7 或 8 行实际在源/测试字符串中查找卡号模式。