2017-08-09 52 views
2

我有一個字符串「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

'tokens = 1如果'aa'存在,'-4'會將最後一部分分配給'%% l';你可以做一個'if'查詢來檢查它是否爲空;所以像這樣:'for/F「tokens = 1-4 delims = - 」%%我in(「xx-yy-zz-aa」)do(設置「USER_COUNTRY = %% l」&如果未定義USER_COUNTRY設置「 USER_COUNTRY = %% k「&如果沒有定義USER_COUNTRY設置」USER_COUNTRY = %% j「)' – aschipfl

回答

6

使用純for(無/f):

set string=xxx-yyy-zzz 
for %%a in (%string:-= %) do set last=%%a 
echo %last% 

(%string:-= %替換每-用空間,所以for可以分割字符串轉換成令牌,並將它們分配到(下同)可變每一個,導致持有最後一個令牌的變量。

+0

這很好,但是如果輸入字符串包含'*'或'?'字符,它會失敗...... – aschipfl

+1

如果字符串已包含等號,空格,逗號或分號(或製表符或/ 0xFF,但這些不太可能) – dbenham

+0

考慮到預期結果被命名爲'User_Country'和雙字母標記,則這些字符都不可能。 – Stephan

3

選項字符串tokens=1-4先給for /F循環分配最後一個字符串部分aa到可變參考%%l如果存在;否則,%%l將是空的。所以,你可以做一個if查詢檢查emptyness和替代的情況下使用%%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% 

這方法可能會失敗,如果輸入字符串包含"字符。

+0

當我意識到自己太遲了時,即將發佈完全相同的自擴展代碼變體。 BTW在這裏不需要延遲擴展。 – LotPings

+0

謝謝,@LotPings,你的權利,所以我刪除了延遲擴展... – aschipfl

2

一種解決方案可能是將字符串轉換,用反斜槓替換破折號所以「似乎」可以與for命令

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "string=xxx-yyy-zzz" 
    for /f "delims=" %%a in ("::%string:-=\%") do set "last=%%~nxa" 

    echo %last% 
+0

這太棒了,+1!顯然它可能會失敗,如果輸入字符串包含'\'或'/'... – aschipfl

+0

@aschipfl,是的,如果字符串中的最後一個元素(以前的值不干涉)可能包含斜線或反斜槓 –

+2

如果字符串以點或空格結尾,則它也有問題。 – dbenham

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 

這個版本仍然有一些字符的問題

相關問題