【问题标题】:Pattern Matching BASIC programming Language and Universe Database模式匹配 BASIC 编程语言和 Universe 数据库
【发布时间】:2023-04-09 03:56:01
【问题描述】:

我需要识别字符串中的以下模式。 - "2N':'2N':'2N" - “2N'-'2N'-'2N” - "2N'/'2N'/'2N" - "2N'/'2N'-'2N" 等等......

如果用简单的语言编写,基本上我想要这种模式 2 个数字 [: / -] 2 个数字 [: / -] 2 个数字

那么无论如何我可以编写一个涵盖所有可能场景的模式吗?否则我必须编写总共 9 个模式,并且必须将所有 9 个模式与字符串匹配......这不是我的代码中的场景,我必须将 4、2 个由 [: / -] 分隔的数字匹配到字符串我必须为此编写总共 27 个模式。因此,为了理解目的,我采用了 3 ,2 位数字场景...... 请帮帮我...谢谢

【问题讨论】:

    标签: basic universe pick


    【解决方案1】:

    也许你可以尝试类似(Pick R83 风格)

    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 行实际在源/测试字符串中查找卡号模式。

    【讨论】:

    • 嘿,谢谢您回答这个问题……但是这里我要比较的字符串不是目标字符串,字符串是这样的“cmets cmets sdgsghsdgsjk 'Credit card number' eghsgkjnhgks” .字符串就像 cmets,在这些 cmets 之间我必须找到信用卡号,因此无法找到确切的位置,因此我们无法使用索引
    • 嘿,这对于代码来说可以工作......我肯定会在我的代码中使用那个逻辑......
    • 如果这解决了您的问题,也许您可​​以考虑“接受”这个答案?
    【解决方案2】:

    不是很完美,但是 2N1X2N1X2N 怎么样,这会让你得到 2 个数字,然后是 1 个任意字符,然后是 2 个数字等。

    【讨论】:

      【解决方案3】:

      这可能会有所帮助:

       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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-12
        • 2011-01-30
        • 1970-01-01
        • 2011-02-28
        • 2013-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多