Получить позицию подстроки по индексу соответствия в пакетном скрипте - PullRequest
1 голос
/ 23 сентября 2019

Я хочу найти позицию подстроки по индексу соответствия.Чтобы быть точным, скажем, есть 6 совпадений в строке, и я хочу положение соответствия номер 4. Пример:

set "myString=barbarbarfoobarfoobarbar"
set "myMatch=bar"
set myMatchIndex=4
... do stuff ...
echo Position is: %position%


Position is: 13

1 Ответ

2 голосов
/ 23 сентября 2019

Следующие результаты приведут к желаемому результату.

Не работает со специальными символами, такими как (!) И ("), убедитесь, что все данные правильно очищены.

:indexOf
setlocal ENABLEDELAYEDEXPANSION
set indexOf_StringPosition=0
set "indexOf_Var1=%~1"
set "indexOf_Var2=%~2"
set indexOf_Var3=%3

:indexOf_NoInitLabel
set indexOf_CurrentPosition=0
set "indexOf_StringTemp=!indexOf_Var1:*%indexOf_Var2%=!"
if "%indexOf_StringTemp%"=="%indexOf_Var1%" (
    set indexOf_StringPosition=-1
    goto :indexOf_BreakLabel
)
set "indexOf_StringTemp2=!indexOf_Var1:%indexOf_Var2%%indexOf_StringTemp%=!"
if "%indexOf_StringTemp2%"=="" (
    set /a indexOf_CurrentPosition+=1
    goto :indexOf_BreakLabel
)

:indexOf_LoopLabel
if "!indexOf_StringTemp2:~%indexOf_CurrentPosition%,1!"=="" (
    set /a indexOf_CurrentPosition+=1
    goto :indexOf_BreakLabel
)
set /a indexOf_CurrentPosition+=1
goto :indexOf_LoopLabel

:indexOf_BreakLabel
set /a indexOf_StringPosition+=%indexOf_CurrentPosition%
set /a indexOf_Var3-=1
set "indexOf_Var1=!indexOf_Var1:~%indexOf_CurrentPosition%!"
if "indexOf_Var1"=="" (
    goto :indexOf_EndLabel
)
if "%indexOf_Var3%"=="0" (
    goto :indexOf_EndLabel
)
goto :indexOf_NoInitLabel

:indexOf_EndLabel
(endlocal & set %4=%indexOf_StringPosition%)
goto :eof

indexOfможно назвать так:

@echo off

set "myString=barbarbarfoobarfoobarbar"
set "myMatch=bar"
set myMatchIndex=4
call :indexOf "%myString%" "%myMatch%" %myMatchIndex% position
echo Position is: %position%
pause


rem Position is: 13


Важное примечание: индекс алгоритма начинается с 1. Это означает, что «b» рассматривается как 1, «a» обрабатываетсякак 2 и т. д. Чтобы начать индекс с 0, добавьте следующее после :indexOf_EndLabel:

if not %indexOf_StringPosition%==-1 set /a indexOf_StringPosition-=1
...