2017-08-01 46 views
2

如何從字符串中刪除所有單個字母?在批處理腳本中刪除字符串中的單個字母

說輸入字符串是什麼字符串

輸出應該是什麼

我試圖set string=%string: ? : %命令,但?通配符不會在這裏工作。

我需要一個通用命令來刪除字符串中的所有單個字母。

+0

通配符在字符串替換中不起作用。 – npocmaka

+1

@npocmaka除了'*'匹配(不合理)的一切,直到搜索字符串的其餘部分。 'Set'String =我什麼東西混亂的東西x「'和'Echo%String:* s =%'會輸出東西x' – LotPings

回答

2

鑑於輸入字符串不包含字符!^"之一,並且不存在任何相鄰的空間(這將被壓縮,以一個),下面的代碼工作:

@echo off 
setlocal EnableDelayedExpansion 

set "string=what a string" 

set "new=" & set "wrd=" & set "aug=%string% " 
set "new=%aug: =" & (if defined wrd if not "!wrd:~1!"=="" set "new=!new! !wrd!") & set "wrd=%" 

echo original: "%string%" 
echo modified: "%new%" 

endlocal 

To mai ntain相鄰空間,修改劇本是這樣的:

@echo off 
setlocal EnableDelayedExpansion 

set "string=what a nice string" 

set "new=" & set "wrd= " & set "aug=%string% " 
set "new=%aug: =" & (if not "!wrd:~1!"=="" set "new=!new! !wrd!") & set "wrd=%" 

echo original: "%string%" 
echo modified: "%new%" 

endlocal 

感謝Aacinihint

+0

比我的批+1更好。 Dostips.com上是否提供了這種類型的自擴展代碼? – LotPings

+2

我第一次接觸到這樣的東西來自[這個答案](https://stackoverflow.com/a/32026314),而這又受到[This DosTips post]的啓發(http:// www。 dostips.com/forum/viewtopic.php?f=3&t=6429&p=41356#p41356)。雖然你不會找到上述答案的代碼... – aschipfl

+0

哇!看來我打開了潘多拉盒子! **'^ _ ^'**我喜歡這個修改!**'')** ** – Aacini

0

提供此功能的嘗試:

@echo off 
setlocal enabledelayedexpansion 

SET TEST=Example1 : "<=> & ^^^! |" 
SET TEST2=Example2 : ">>=^^^!>=^^^!<====<^^^!<=^^^!<=<=<&&<=^^^!<=<=|<&^=^=^!<||&===" 
Set TEST3=Example3 : "?????? Hello ??????" 

echo;%TEST%  before Replace 
call :ReplaceSpecialChar TEST "_" 
echo;%TEST%  after Replace 

echo; 

echo;%TEST2%  before Replace 
call :ReplaceSpecialChar TEST2 "_" 
echo;%TEST2%  after Replace 

echo; 
echo;%TEST3%  before Replace 
call :ReplaceSpecialChar TEST3 " " 
echo;%TEST3%  after Replace 

pause>nul&exit 
:ReplaceSpecialChar 
call :ReplaceSpecialCharTmp %1 "?" %2 
call :ReplaceSpecialCharTmp %1 "&" %2 
call :ReplaceSpecialCharTmp %1 "<" %2 
call :ReplaceSpecialCharTmp %1 ">" %2 
call :ReplaceSpecialCharTmp %1 "|" %2 
call :ReplaceSpecialCharTmp %1 "=" %2 
call :ReplaceSpecialCharTmp %1 "^^^!" %2 
goto :eof 
:ReplaceSpecialCharTmp 
set work=!%1! 
set /a i = 0 
:ReplaceLoop 
if "!work:~%i%,1!"=="" (set %1=!work!&goto :eof) 
if not "!work:~%i%,1!"=="%~2" (set /a i += 1&goto ReplaceLoop) 
set head=!work:~0,%i%! 
set /a i += 1 
set work=!head!%~3!work:~%i%! 
goto :ReplaceLoop 
1
  • 你將不得不遍歷所有的字母
  • 以下批處理也檢查字符串開始/結束

編輯發現了一個字符串開始/結束的缺陷,他們將不可避免地刪除一個字符。
如果一行中有一個以上的字符,只有第一個字符將被刪除,以便在for循環中克服此重複%Letters%

@Echo off 
Setlocal EnableExtensions EnableDelayedExpansion 
Set "Letters= a b c d e f g h i j k l m n o p q r s t u v w x y z " 
Set "String=i what a mess o things x" 
IF "%~1" neq "" Set "String=%~1" 
Echo Original String: %String% 

For %%A in (%Letters%%Letters%) Do Set "String=!String: %%A = !" 
:: Echo:%String:~0,2%|Findstr /Li "%Letters%" >Nul 2>&1 && Set "String=%String:~2%" 
:: Echo:%String:~-2%|Findstr /Li "%Letters%" >Nul 2>&1 && Set "String=%String:~0,-2%" 

Echo Processed String: %String% 

示例輸出:

> RemoveSingleLetters.cmd 
Original String: i what a mess o things x 
Processed String: what mess things 
+0

我認爲這對我應該是件好事。我試圖用通配符思考較短的代碼,因爲它只是我的批處理腳本的一部分。但是這應該爲我做這項工作。 –

+0

這種方法會比較簡單,如果在'for'之前,你在開始和結束時插入一個空格,並在'for'之後刪除它們... – Aacini

相關問題