mie*_*mia 3 cmd alphanumeric batch-file non-alphanumeric
在批处理中,如何从变量中删除所有非字母数字(az,AZ,0-9,_)字符?
我很确定我需要使用findstr和正则表达式.
MC ND的解决方案有效,但它确实很慢(小型测试样品需要~1秒).
这是由echo "!_buf!"|findstr ...构造引起的,因为管道创建两个cmd.exe实例并启动每个字符findstr.
但这也可以用纯批次解决.
如果每个字符都在map变量中,则对其进行测试
:test
set "_input=Th""i\s&& is not good _maybe_???"
set "_output="
set "map=abcdefghijklmnopqrstuvwxyz 1234567890"
:loop
if not defined _input goto endLoop
for /F "delims=*~ eol=*" %%C in ("!_input:~0,1!") do (
if "!map:%%C=!" NEQ "!map!" set "_output=!_output!%%C"
)
set "_input=!_input:~1!"
goto loop
:endLoop
echo(!_output!
Run Code Online (Sandbox Code Playgroud)
当goto循环被移除时,它可以加速.
然后你需要先计算stringLength,然后在每个字符上用FOR/L循环迭代.
该解决方案比上述方法快约6倍,比MC ND解决方案快约40倍
set "_input=Th""i\s&& is not good _maybe_!~*???"
set "_output="
set "map=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890"
%$strLen% len _input
for /L %%n in (0 1 %len%) DO (
for /F "delims=*~ eol=*" %%C in ("!_input:~%%n,1!") do (
if "!map:%%C=!" NEQ "!map!" set "_output=!_output!%%C"
)
)
exit /b
Run Code Online (Sandbox Code Playgroud)
宏$ strlen可以定义
set LF=^
::Above 2 blank lines are required - do not remove
@set ^"\n=^^^%LF%%LF%^%LF%%LF%^^":::: StrLen pResult pString
set $strLen=for /L %%n in (1 1 2) do if %%n==2 (%\n%
for /F "tokens=1,2 delims=, " %%1 in ("!argv!") do (%\n%
set "str=A!%%~2!"%\n%
set "len=0"%\n%
for /l %%A in (12,-1,0) do (%\n%
set /a "len|=1<<%%A"%\n%
for %%B in (!len!) do if "!str:~%%B,1!"=="" set /a "len&=~1<<%%A"%\n%
)%\n%
for %%v in (!len!) do endlocal^&if "%%~b" neq "" (set "%%~1=%%v") else echo %%v%\n%
) %\n%
) ELSE setlocal enableDelayedExpansion ^& set argv=,
Run Code Online (Sandbox Code Playgroud)