gpt4 book ai didi

batch-file - 删除批处理变量中的非字母数字字符

转载 作者:行者123 更新时间:2023-12-01 07:14:01 24 4
gpt4 key购买 nike

如何批量删除变量中的所有非字母数字 (a-z,A-Z,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!

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

宏 $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=,

关于batch-file - 删除批处理变量中的非字母数字字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19855925/

24 4 0
文章推荐: r - 在 R 中按周、月等聚合数据
文章推荐: jQuery.Marquee 插件 : Scroll left AND text-align left from the beginning
文章推荐: jQuery 选择不显示