2017-08-01 99 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

相关问题