4

バッチで、英数字以外のすべての文字 (az、AZ、0-9、_) を変数から削除するにはどうすればよいですか?

findstr と正規表現を使用する必要があると確信しています。

4

3 に答える 3

8

MC ND のソリューションは機能しますが、非常に遅いです (小さなテスト サンプルの場合、約 1 秒かかります)。

これはecho "!_buf!"|findstr ...、各文字についてパイプが cmd.exe の 2 つのインスタンスを作成し、 を開始するため、構造が原因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=,
于 2013-11-08T11:22:33.790 に答える
3
@echo eof

call :purge "~~asd123#()%%%^"^!^"~~~^:^=asd^>^<bm_1" var
echo (%var%)
goto :eof


:purge StrVar  [RtnVar]
setlocal disableDelayedExpansion
set "str1=%~1"
setlocal enableDelayedExpansion

for %%a in ( -  ! @ # $ % ^^ ^&  + \ / ^< ^>  . '  [ ] { }  ` ^| ^"  ) do (
   set "str1=!str1:%%a=!"
 )

 rem dealing with some delimiters


 set "str1=!str1:(=!"
 set "str1=!str1:)=!"
 set "str1=!str1:;=!"
 set "str1=!str1:,=!"
 set "str1=!str1:^^=!"
 set "str1=!str1:^~=!"

 set "temp_str=" 
 for %%e in (%str1%) do (
  set "temp_str=!temp_str!%%e"
 )

endlocal & set "str1=%temp_str%"



setlocal disableDelayedExpansion
set "str1=%str1:!=%"
set "str1=%str1::=%"
set "str1=%str1:^^~=%"

for /f "tokens=* delims=~" %%w in ("%str1%") do set "str1=%%w"

endlocal & set "str1=%str1%"



endlocal &  if "%~2" neq "" (set %~2=%str1%) else echo %str1%

goto :eof

まだ対処できません~ and =が、それに取り組んでいます

編集: =今はクリアされます 編集: ~今はクリアされます

于 2013-11-08T10:11:06.420 に答える