0

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

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

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

4

3 回答 3

1

也许您可以尝试类似(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 行实际在源/测试字符串中查找卡号模式。

于 2016-08-19T00:05:01.857 回答
0

这可能会有所帮助:

 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
于 2016-09-30T05:15:14.000 回答
0

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

于 2016-08-18T18:41:28.907 回答