BHT-BASICにはLike演算子はなくそれに匹敵する関数もないため自分で作ることにした。
作成したのはLike関数でパターン文字列は*と?にのみ対応している
作成・デバッグはすべてVB6で行なった。← こんなことができるのもBHT-BASICのいいところです。
BHT-BASIC4.0を対象にしたが、複雑ではないので3.5でも動くかも??
'//-------------------------------------------------------------- '//Like%(比較文字列,パターン) '//引数: '// 比較文字列 '// おそらく255文字以内 '// パターン文字は次の文字に対応 '// ? 任意の1文字 '// * 任意の数の文字 '//戻り値: '// 一致の場合は-1(True) '// 不一致の場合は0(False) '//-------------------------------------------------------------- Function Like%(paramSource$, paramPattern$) '//VB6デバック用 '// Dim srcLen% '// Dim ptnLen% '// Dim char$ '// Dim target$ '// Dim pos% '// Dim tmppos% '// Dim lp1% '// Dim lp2% '// Dim lp3% '// Dim result% '// Dim fflag% Const resMatch = -1 Const resNoMatch = 0 Private srcLen% Private ptnLen% Private char$[1] Private target$[255] Private pos% Private tmppos% Private lp1% Private lp2% Private lp3% Private result% Private fflag% srcLen% = Len(paramSource$) ptnLen% = Len(paramPattern$) If srcLen% > 0 And ptnLen% > 0 Then result% = resMatch lp2% = 1 For lp1% = 1 To srcLen% '//パターンが終わったのにまだ比較文字列が残っている場合は不一致 If lp2% > ptnLen% Then result% = resNoMatch Exit For End If '//パターンから1文字取り出し char$ = Mid$(paramPattern$, lp2%, 1) Select Case char$ '// ワイルドカード ? の処理 Case "?" '//次の比較する文字へポインターを移動 lp2% = lp2% + 1 '// ワイルドカード * の処理 Case "*" If lp2% = ptnLen% Then '//比較文字列の最後が*の場合、これ以上比較する必要はない Exit For End If '//*の次の文字から 次の*or?までを取り出し、検索文字列とする lp2% = lp2% + 1 pos% = ptnLen% tmppos% = InStr(lp2%, paramPattern$, "*") If tmppos% <> 0 And pos% >= tmppos% Then pos% = tmppos% - 1 Else tmppos% = InStr(lp2%, paramPattern$, "?") If tmppos% <> 0 And pos% >= tmppos% Then pos% = tmppos% - 1 End If End If target$ = Mid$(paramPattern$, lp2%, (pos% - lp2%) + 1) '//検索文字列を使って後方から検索 fflag% = 0 For lp3% = srcLen% To lp1% Step -1 If target$ = Mid$(paramSource$, lp3%, Len(target$)) Then '//比較される文字列ポインターを見つかった場所へ変更(ForNextでまわしている関係) lp1% = lp3% + Len(target$) - 1 lp2% = pos% + 1 fflag% = -1 Exit For End If Next lp3% '//検索して見つからない場合は不一致 If fflag% = 0 Then result% = resNoMatch Exit For End If '// ワイルドカード以外の処理(単純に1文字比較) Case Else If char$ <> Mid$(paramSource$, lp1%, 1) Then result% = resNoMatch Exit For Else lp2% = lp2% + 1 End If End Select Next '//比較文字列がすべて終わったのに、まだパターンが残っている場合は不一致 If lp1% - 1 = srcLen% And lp2% - 1 <> ptnLen% Then result% = resNoMatch End If Else result% = resNoMatch End If Like% = result% End Function
0 件のコメント:
コメントを投稿