我有多个格式为random_Gnumbers的字符串。例如abcd_G123或32893hfj_G7890。我想从字符串中删除数字的最后一位,直到遇到G。没有固定数量的字符,也没有特殊字符。如何提取G之前和包括G的所有内容。例如,我想从32893hfj_G7890中提取32893hfj_G
实现此目的的一种方法是使用Sets内置的子字符串容量,使用基于For Loop的函数来标识_G的位置。
以下示例中的函数具有一定的灵活性。它使用字符串值,返回字符串的变量名,要定位的子字符串以及目标子字符串的长度来调用。
For ideas about how to apply it to large numbers of strings visit here
@echo off
Set _S=123456789_G123567
Call :ModString %_S% _S _G 2
ECHO(%_S%
pause
:ModString REM <stringVal> <stringVar> <targetSubString> <SubstringLength>
Setlocal EnableDelayedExpansion
IF "%~1"=="" CALL :MS_Syntax 1
IF "%~2"=="" CALL :MS_Syntax 2
IF "%~3"=="" CALL :MS_Syntax 3
IF "%~4"=="" CALL :MS_Syntax 4
IF Defined ParamError (
pause
exit
)
Set "tmp=%1"
:Modloop
For /L %%a in (0,1,100) DO (
Set tmpMod=!tmp:~%%a,%~4!
IF "!tmpMod!"=="%~3" (
Set tmp=!tmp:~0,%%a!%3
GOTO :endPos
)
)
(
ENDLOCAL
ECHO( String did Not Contain the target value.
exit /b
)
:endPos
(
ENDLOCAL & Set "%~2=%tmp%"
exit /b
)
:MS_Syntax
IF "%~1"=="1" ECHO( Paramater %1 Missing. Must contain the String value Ie: %%VarName%%
IF "%~1"=="2" ECHO( Paramater %1 Missing. Must contain the Variable name Ie: VarName
IF "%~1"=="3" ECHO( Paramater %1 Missing. Must contain the target Substring Ie: _G
IF "%~1"=="4" ECHO( Paramater %1 Missing. Must contain the Substrings length Ie: 2
Set ParamError=true
exit /b
Set "tmp=%1"
将整个字符串的值分配给tmp变量Set tmpMod=!tmp:~%%a,%4!
使用Sets Substring Modifications在for循环期间从字符串的开头开始逐渐修整,保留为Substring指定的长度。 IF "!tmpMod!"=="%3" (
Set tmp=!tmp:~0,%%a!%3
GOTO :endMod
)
检查当前修剪的字符串是否与目标子字符串匹配,然后在退出For循环之前将所需的字符串设置为tmp。
:endMod
(
ENDLOCAL & Set "%~2=%tmp%"
exit /b
)
结束本地环境并将缩短的字符串的值返回到原始变量。