Pattern Matching BASIC язык программирования и база данных юниверса
Мне нужно определить следующие шаблоны в строке. - "2N": "2N": "2N" - "2N" - "2N" - "2N" - "2N" / "2N" / "2N" - "2N" / "2N" - "2N" И ТАК НА.....
в основном я хочу этот шаблон, если написан на простом языке 2 НОМЕРА [: / -] 2 НОМЕРА [: / -] 2 НОМЕРА
Так есть ли способ, с помощью которого я мог бы написать один шаблон, который будет охватывать все возможные сценарии? или же я должен написать всего 9 шаблонов и должен был сопоставить все 9 шаблонов со строкой.... и это не сценарий в моем коде, я должен сопоставить 4, 2 цифры, разделенные [: / -], в строку для которого у меня есть всего 27 шаблонов. Так что для понимания цели я взял 3,2-значный сценарий... Пожалуйста, помогите мне... Спасибо
3 ответа
Может быть, вы могли бы попробовать что-то вроде (стиль Pick R83)
ОК = Х МАТЧ "2N1X2N1X2N" И Х [3,1]= Х [6,1] И ИНДЕКС (":/-", Х [3,1],1) > 0
Где переменная X является некоторой входной строкой, такой как: 12-34-56
Следует установить переменную OK равной 1, если проверка прошла успешно, иначе 0 для любого неверного формата.
Похоже, что все необходимые проверки в одном утверждении. Я предположил, что нечисловые символы должны быть одинаковыми. Если это не так, проверка может быть изменена на что-то вроде:
ОК = Х СООТВЕТСТВУЕТ "2N1X2N1X2N" И ИНДЕКС (":/-", Х [3,1],1) > 0 И ИНДЕКС (":/-", Х [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 строк, которые на самом деле ищут шаблон номера карты в исходной / тестовой строке.
Не совсем идеально, но как насчет 2N1X2N1X2N, то есть 2 числа, за которыми следует 1 любой символ, затем 2 числа и т. Д.
Это может помочь:
BIG.STRING ="HELLO TILDE ~ CARD 12:34:56 IS IN THIS STRING"
TEMP.STRING = BIG.STRING
CONVERT "~:/-" TO "*~~~" IN TEMP.STRING
IF TEMP.STRING MATCHES '0X2N"~"2N"~"2N0X' THEN
FIRST.TILDE.POSN = INDEX(TEMP.STRING,"~",1)
CARD.STRING = BIG.STRING[FIRST.TILDE.POSN-2,8]
PRINT CARD.STRING
END