String 批处理以仅保留字符串中的某些字符

String 批处理以仅保留字符串中的某些字符,string,for-loop,batch-file,trim,String,For Loop,Batch File,Trim,我有一个变量来自批处理文件中的for循环: for /f Tokens^=3^,10delims^=^<^>^" %%i in ('findstr -i "href=" bookmarks.html') do ( set str1=%%j for/f令牌^=3^,10delims^=^^^“%%i in('findstr-i“href=“bookmarks.html”)do( 设置str1=%%j 如何仅保留变量str1中的某些字符?:a-z,a-z,0-9 例如: Bla

我有一个变量来自批处理文件中的
for
循环:

for /f Tokens^=3^,10delims^=^<^>^" %%i in ('findstr -i "href=" bookmarks.html') do (
   set str1=%%j
for/f令牌^=3^,10delims^=^^^“%%i in('findstr-i“href=“bookmarks.html”)do(
设置str1=%%j
如何仅保留变量str1中的某些字符?:a-z,a-z,0-9

例如:
Blabla
bla2378

提前谢谢

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "string=+"
FOR /l %%i IN (32,1,127) DO CALL :addstring %%i
ECHO !string!
FOR /l %%i IN (100,-1,0) DO CALL :delstring %%i
ECHO !string!
GOTO :eof

:addstring
CALL CMD /c EXIT /b %1
SET "string=!string!!=exitcodeascii!"
GOTO :eof

:delstring
SET cp=!string:~%1!
IF NOT DEFINED cp GOTO :EOF 
ECHO abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ|FIND "!string:~%1,1!" >NUL 2>nul
IF NOT ERRORLEVEL 1 GOTO :eof
SET /a cp=%1+1
SET "string=!string:~0,%1!!string:~%cp%!"
GOTO :eof
好吧,这里有一个方法至少可以做很多

ADDSTRING
例程只是构建一个字符列表,开头带有“+”,除了演示字符串以空格开头外,没有其他原因

通过反复调用
delstring
,从字符串末尾向后运行,不在字母数字列表中的每个字符都将被删除


编辑以应用示例字符串

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "string=+-=++()*&^^^#!!!<--remove all of those and those----->.,?/';][}{__"
ECHO before: !string!
FOR /l %%i IN (70,-1,0) DO CALL :delstring %%i
ECHO after : !string!
SET "string= "blablabla23:/./é'""
ECHO before: !string!
FOR /l %%i IN (20,-1,0) DO CALL :delstring %%i
ECHO after : !string!
GOTO :eof

:delstring
SET cp=!string:~%1!
IF NOT DEFINED cp GOTO :EOF 
ECHO abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ|FIND "!string:~%1,1!" >NUL 2>nul
IF NOT ERRORLEVEL 1 GOTO :eof
SET /a cp=%1+1
SET "string=!string:~0,%1!!string:~%cp%!"
GOTO :eof
批处理速度非常慢。它可以完成任务,只是需要花时间。我的意思是我也可以在后院割草——我只是需要花时间

现在,如果你想在数千个字符串上完成这项工作,可能它们在一个或多个文件中。你应该找到SED-谷歌
gnused
将是一个良好的开始

按照您的要求执行SED命令将是

sed s/[^^a-zA-Z0-9]//g <filename >newfilename
sed s/[^^a-zA-Z0-9]///g新文件名

如果需要双插入符号,因为就
CMD.EXE
而言,插入符号是一个特殊字符,因此需要用插入符号进行转义。

非常感谢peter!但是我有点不知所措(我不理解这些
call CMD
等)。您有一个简单示例字符串的示例吗?示例:
mystr1=”bla23:///é'"
所有的
addstring
例程都是构建一个可打印字符的字符串。它不涉及“删除所有非字母数字”功能。您所需要做的就是指定要从中选择非字母数字的任何字符串,然后用第一个thr执行
FOR/l.:delstring%%i
命令括号中的ee数字至少是字符串的长度。8000是一个好数字-但它越大,例程运行所需的时间就越长。我将用几个例子来修改帖子。谢谢,但我还是迷路了…你能举一个以
@ECHO OFF
SETLOCAL ENABLEDELAYED开头的例子吗扩展
并以
echo str2
结尾,其中
str2
str1
的清洁版本?提前感谢了很多!奇怪的是:每个字符串需要1或2秒(平均50个字符长)…我有1000个字符串要处理;)没有解决方案:替换
[^a-zA-Z0-9]
作者<代码>“”
?如何用批处理搜索/替换regexp?批处理中没有“替换”工具,但您可以在Windows中使用
sed
sed s/[^^a-zA-Z0-9]//g <filename >newfilename