2017-08-01 22 views
2

文字列からすべての文字を削除するにはどうすればよいですか?バッチスクリプトの文字列から単一文字を削除する

は、入力文字列が文字列

出力は私がset string=%string: ? : %コマンドを試してみましたが、?ワイルドカードは、ここでは動作しませんどのような文字列

どうあるべきかであると言います。

文字列からすべての1文字を削除するには、汎用コマンドが必要です。

+0

ワイルドカードが文字列置換で機能していません。 – npocmaka

+1

@npocmaka '*'を除いて、検索文字列の残りの部分まですべてを一致させます。 'Set" String =私は何を混乱させるのでしょうか? ''と '' Echo%String:* s =% 'は' s things x'を出力します。 – LotPings

答えて

2

入力文字列が文字!^"の1が含まれていないことを考えると、に圧縮されるだろう(何の隣接スペースがないこと1)、次のコードが動作します。

@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、このようなスクリプトを変更:hintためAacini

@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 

感謝を!

+0

私のバッチ+1よりも優れています。この種の自己拡張コードについては、Dostips.comに参考文献がありますか? – LotPings

+2

初めて私がこのようなものに触れたのは、[こちらの回答](https://stackoverflow.com/a/32026314)でした。これは[こちらのDosTips投稿](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
  • をあなたは次のバッチは、文字列を開始/終了

EDITをチェックし、すべての文字

  • を反復処理する必要があります文字列begin/endで脆弱性が発見された場合、必然的にcharが削除されます。
    1つの行に2つ以上の文字がある場合、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'の前にbeginとendのスペースを挿入し、' for'の後にスペースを挿入すると簡単になります。 – Aacini

    関連する問題