Может быть, вы могли бы попробовать что-то вроде (выберите стиль R83)
OK = X ПОИСКПОЗ "2N1X2N1X2N" И X[3,1]=X[6,1] И ИНДЕКС(":/-",X[3,1],1) > 0
Где переменная X - это некоторая входная строка, например: 12-34-56.
Следует установить для переменной OK значение 1, если проверка прошла успешно, иначе 0 для любого недопустимого формата.
Кажется, что все ваши необходимые проверки в одном утверждении. Я предположил, что нечисловые символы должны быть одинаковыми. Если это не так, проверка может быть изменена на что-то вроде:
OK = X ПОИСКПОЗ "2N1X2N1X2N" И ИНДЕКС(":/-",X[3,1],1) > 0 И ИНДЕКС(":/-",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 строк, которые фактически ищут шаблон номера карты в исходной/тестовой строке.
person
stope19
schedule
19.08.2016