Как извлечь номер из строки в пакетном режиме - PullRequest
1 голос
/ 25 мая 2011

Я хотел бы извлечь первое число, найденное в строке пути.

Некоторые примеры

c:\dir\release1\temp  should extract: 1
c:\dir\release11\temp  should extract: 11
c:\dir\release1\temp\rel2  should extract: 1
c:\dir\release15a\temp  should extract: 15

Мой текущий код, который зацикливает имена папок и проверяет, является ли имя папки числом (мне нужны некоторые изменения здесь):

setlocal enableextensions enabledelayedexpansion
set line=one\two\three\4\pet\0\sest\rel6\a
rem set line=%cd%
:processToken
for /f "tokens=1* delims=\" %%a in ("%line%") do (
echo Token: %%a
set line=%%b
rem need fix here: need to extract number from string
echo %%a|findstr /r /c:"^[0-9][0-9]*$" >nul
if errorlevel 1 (echo not a number) else (echo number)
)
if not "%line%" == "" goto :processToken
endlocal

Спасибо!

EDIT: Я хотел разобрать номер из этой строки пути. Ну, я нашел решение, которое проверяет только последние 3 символа строки. Пока все нормально.

::test last 3 characters
set relno=!token:~-3,3!
echo !token:~-3,3!|findstr /r /c:"^[0-9]*$" >nul
if errorlevel 1 (echo not number) else (echo number)

::test last 2 characters
set relno=!token:~-2,2!
echo !token:~-2,2!|findstr /r /c:"^[0-9]*$" >nul
if errorlevel 1 (echo not number) else (echo number)

::test last character
set relno=!token:~-1,1!
echo !token:~-1,1!|findstr /r /c:"^[0-9]*$" >nul
if errorlevel 1 (echo not number) else (echo number)

1 Ответ

5 голосов
/ 13 июня 2011

Хорошо, вот версия только для партии.Он реализует isdigit, обходит ввод, ища первую цифру, останавливается и печатает символы между тем, когда он достигает конца или не цифрой.

Это медленно - чем длиннее ввод, тем медленнее он.

@setlocal
@echo off
rem extractfirstnumber.bat
rem Given a string possibly containing a number, print the first integer.
rem 123test456 -> 123
rem Note that special characters may not be properly handled.  (e.g. , ;)
rem /4990510/kak-izvlech-nomer-iz-stroki-v-paketnom-rezhime
set input=%1
if ("%input%") == ("") goto :eof
call :firstnum input output
if not ("%output%") == ("") echo %output%&&goto end_success
goto end_fail

:end_success
endlocal
@exit /b 0

:end_fail
endlocal
@exit /b 1

:firstnum
SETLOCAL ENABLEDELAYEDEXPANSION
call set "string=%%%~1%%"
set /a index = 0
set return_number=
goto firstnum_loop

:firstnum_loop
if ("!string:~%index%,1!") == ("") goto firstnum_end
set test_char=!string:~%index%,1!
call :isdigit test_char is_digit
rem Found a digit?  Add it to the return.
if ("%is_digit%") == ("true") set return_number=%return_number%%test_char%
rem Found a not-digit?  If we found a digit before, end.
if ("%is_digit%") == ("false") if not ("%return_number%") == ("") goto firstnum_end
set /a index = %index% + 1
goto firstnum_loop

:firstnum_end
( ENDLOCAL & REM RETURN VALUES
    IF "%~2" NEQ "" SET "%~2=%return_number%"
)
goto :eof

:isdigit
SETLOCAL ENABLEDELAYEDEXPANSION
set NUMBERS=1234567890
set found_number=false
call set "string=%%%~1%%"
REM If the passed string does not have a single character, return immediately with false.
if ("%string:~0,1%") == ("") goto isdigit_end
if not ("%string:~1,1%") == ("") goto isdigit_end
set /a index=0
goto isdigit_loop

:isdigit_loop
if ("!NUMBERS:~%index%,1!") == ("") goto isdigit_end
set test_char=!NUMBERS:~%index%,1!
if ("%test_char%") == ("%string%") set found_number=true&&goto isdigit_end
set /a index = %index% + 1
goto isdigit_loop

:isdigit_end
( ENDLOCAL & REM RETURN VALUES
    IF "%~2" NEQ "" SET "%~2=%found_number%"
)
goto :eof

Пример вывода:

C:\>extractfirstnumber c:\dir\release1\temp
1
C:\>extractfirstnumber c:\dir\release11\temp
11
C:\>extractfirstnumber c:\dir\release1\temp\rel2
1
C:\>extractfirstnumber c:\dir\release15a\temp
15
...