OPTION BASE 0 DIM TT$(100),PP$(100) LET T$="1234 567あいabcdefghi愛jklmnopqrstuvwxyzAAAAABCDEFGHIアイabcdefghiアイjk" PRINT PRINT "テキスト:" PRINT " ";T$ PRINT INPUT PROMPT "検索文字列? ":P$ PRINT LET TL=LEN(T$) LET PL=LEN(P$) FOR i=1 TO TL LET TT$(i)=T$(i:i) NEXT i FOR i=1 TO PL LET PP$(i)=P$(i:i) NEXT i LET PL0=PL LET S=0 LET Z=O DO UNTIL PL=>TL IF PP$(PL0)<>TT$(PL) THEN LET C=1 FOR i=1 TO PL0-1 IF PP$(PL0-i)=TT$(PL) THEN EXIT FOR LET C=C+1 NEXT i LET S=C ELSE LET C=1 FOR i=1 TO PL0-1 IF PP$(PL0-i)<>TT$(PL-i) THEN EXIT FOR LET C=C+1 NEXT i IF C=PL0 THEN PRINT "見つけた! ";PL-PL0+1;"番目の文字からだ! ";T$(PL-PL0+1:PL) LET Z=Z+1 END IF LET S=C LET C=1 FOR i=1 TO PL0-1 IF PP$(PL0-i)=TT$(PL) THEN EXIT FOR LET C=C+1 NEXT i LET S=C END IF LET PL=PL+S LOOP IF Z=0 THEN PRINT "残念! 探したがその文字列はなかった。" END IF PRINT END ################################################################################ OPTION CHARACTER BYTE DIM ss$(100),AA$(100) LET s$="1234 567 abcdefghiAAAAABCDEFGHI abcdefghijk" PRINT PRINT "テキスト:" PRINT " ";s$ PRINT PRINT INPUT PROMPT "検索文字列? ":A$ PRINT PRINT " "; LET sL=LEN(s$) LET AL=LEN(A$) FOR i=1 TO sL LET ss$(i)=s$(i:i) NEXT i FOR i=1 TO AL LET AA$(i)=A$(i:i) NEXT i LET G=0 LET h=1 DO CALL kensak(s$,A$,h,k,e) IF e=0 THEN EXIT DO IF h=1 THEN FOR i=h TO h+k-2 PRINT ss$(i); NEXT i ELSE FOR i=h+AL-1 TO h+k-2 PRINT ss$(i); NEXT i END IF CALL SetColor(255,0,0) FOR i=h+k-1 TO h+k+AL-2 PRINT ss$(i); NEXT i CALL SetColor(0,0,0) LET G=G+1 LET h=h+k !PRINT "##G:";G;"k:";k;"h:";h;"##"; LOOP FOR i=h+AL-1 TO sL PRINT ss$(i); NEXT i PRINT END EXTERNAL SUB kensak(T$,P$,n,m,Z) !(テキスト,検索文字列,検索開始場所,検索文字場所,検索ヒット数) DIM TT$(1000),PP$(50) LET TL=LEN(T$) LET PL=LEN(P$) FOR i=1 TO TL LET TT$(i)=T$(i:i) NEXT i FOR i=1 TO PL LET PP$(i)=P$(i:i) NEXT i LET PL0=PL LET S=0 LET Z=O DO UNTIL PL=>TL IF PP$(PL0)<>TT$(PL+n-1) THEN LET C=1 FOR i=1 TO PL0-1 IF PP$(PL0-i)=TT$(PL+n-1) THEN EXIT FOR LET C=C+1 NEXT i LET S=C ELSE LET C=1 FOR i=1 TO PL0-1 IF PP$(PL0-i)<>TT$(PL+n-1-i) THEN EXIT FOR LET C=C+1 NEXT i IF C=PL0 THEN LET m=PL-PL0+1 LET Z=Z+1 EXIT DO END IF LET S=C LET C=1 FOR i=1 TO PL0-1 IF PP$(PL0-i)=TT$(PL+n-1) THEN EXIT FOR LET C=C+1 NEXT i LET S=C END IF LET PL=PL+S LOOP END SUB EXTERNAL SUB SetColor(R,G,B) OPTION CHARACTER Byte SUB SendMessage(hwnd,msg,wparam,lparam$) ASSIGN "USER32.DLL","SendMessageA" END SUB LET EM_SETCHARFORMAT=BVAL("0444",16) LET CHARFORMAT$=CHR$(60) & REPEAT$(CHR$(0),59) LET CHARFORMAT$(8:8)=CHR$(64) LET CHARFORMAT$(21:24)=CHR$(R) & CHR$(G) & CHR$(B) & CHR$(0) CALL SendMessage(WinHandle("RICHEDIT"),EM_SETCHARFORMAT,1, CHARFORMAT$) END SUB