Home / Windows:バッチファイル - 部分一致検索 strstr

もう少し本格的に strstr()もどきを作る。

機能:%1から%2に一致する部分を探す。
%1:検索被対象文字列
%2:検索文字列
戻り値:ERRORLEVEL に検索結果を残す。
    0以上なら見つかった位置の Offset。
    負なら見つからなかった。

:strstr
    if "%~1" EQU "" exit /b -1	引数が空ならエラー
    if "%~2" EQU "" exit /b -2	で終わり。
    set s1=%~1
    set s2=%~2
    set p1=0	%1の参照ポインタ
    set p2=0	%2の参照ポインタ
:L1
    if /I "!s1:~%p1%,1!" NEQ "!s2:~%p2%,1!" (
        set p2=0	不一致なら%2は先頭へリセットしておく。
    ) else (
        set /A p2+=1
    )
    set /A p1+=1
    if "!s2:~%p2%,1!" EQU "" (
        set /A p1-=p2	一致した先頭位置を求めて
        exit /b !p1!	終わる。
    )
    if "!s1:~%p1%,1!" EQU "" exit /b -3		被対象の終わりまで来たら不一致。
    goto :L1

1文字ずつ比較してどちらかの終端まで繰り返す。
if に /I を付けているので英字の大小は問わない。

呼び出しを書けばこんな感じ。

@echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
call :strstr %1 %2
echo ERRORLEVEL=%ERRORLEVEL%
if ERRORLEVEL 0 (
    echo %ERRORLEVEL% 文字目で一致しました。
)
endlocal
exit /b
> hoge.cmd  "01234abc89" ABd
ERRORLEVEL=-3

> hoge.cmd  "01234abc89" AB
ERRORLEVEL=5
5 文字目で一致しました。

良さそうだ。


Home / Windows:バッチファイル - 部分一致検索 strstr

© 2008 usskim    http://usskim.web.fc2.com/
inserted by FC2 system