我有一个字符串" xx-yy-zz"
我需要在最后一个减号后获得该部分。
通常,我这样做
FOR /F "tokens=1-3 delims=-" %%i IN ("xx-yy-zz") DO SET USER_COUNTRY=%%k
echo Country: %USER_COUNTRY%
但是现在我没有固定长度的字符串(可能有2/3/4分隔符)
如何指定我想要最后一张?所以我的代码适用于" xx-yy-zz"以及" xx-yy-zz-aa"
有人可以帮帮忙吗?
答案 0 :(得分:7)
使用普通for
(不含/f
):
set string=xxx-yyy-zzz
for %%a in (%string:-= %) do set last=%%a
echo %last%
(%string:-= %
用空格替换每个-
,因此for
可以将字符串拆分为标记并将它们中的每一个分配给(相同的)变量,从而导致变量保持最后一个标记。
答案 1 :(得分:3)
选项字符串tokens=1-4
会让for /F
循环将最后一个字符串部分aa
分配给变量引用%%l
(如果存在);否则%%l
将为空。因此,您可以执行if
查询以检查是否为空,并使用%%k
代替,以此类推,依此类推:
for /F "tokens=1-4 delims=-" %%i in ("xx-yy-zz-aa") do (
set "USER_COUNTRY=%%l"
if not defined USER_COUNTRY set "USER_COUNTRY=%%k"
if not defined USER_COUNTRY set "USER_COUNTRY=%%j"
)
echo/%USER_COUNTRY%
另一种方法是:
set "STRING=xx-yy-zz-aa"
set "DUMMY=%STRING:-=" & set "USER_COUNTRY=%"
echo/%USER_COUNTRY%
如果输入字符串包含"
个字符,则此方法可能会失败。
答案 2 :(得分:2)
一种解决方案可能是转换字符串,用反斜杠替换破折号,以便"似乎" 可以使用for
命令处理的路径
@echo off
setlocal enableextensions disabledelayedexpansion
set "string=xxx-yyy-zzz"
for /f "delims=" %%a in ("::%string:-=\%") do set "last=%%~nxa"
echo %last%
答案 3 :(得分:2)
另一个例子:
@Echo Off
Set/P "InString=Enter your delimited string: "
Echo=
If "%InString%"=="" GoTo :EOF
Set/P "Delimiter=Enter the delimiter: "
Echo=
If "%Delimiter%"=="" GoTo :EOF
Set "Delimiter=%Delimiter:~,1%"
:Loop
If Defined InString (
For /F "EOL=%Delimiter% Tokens=1* Delims=%Delimiter%" %%A In ("%InString%"
) Do (Set "LastToken=%%A" & Set "InString=%%B") & GoTo Loop
) Else Set LastToken
Timeout -1
Exit/B
此版本仍会出现一些字符问题