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
Другие вопросы по тегам