2017-02-23 9 views
1

以下の形式を次のテキストを一致させるためにはfindstrを使用しようとすると:Findstr regexを使用してダッシュ( - )を一致させるにはどうすればいいですか?

PTB-14 
AIR-217 

私がいる問題は、私はちょうどfindstrがダッシュで一致するように見えることはできませんということです- 。私は、バッチファイルに以下のスクリプトを作成しました:

set dash=- 
echo.%dash% 
echo !dash! | findstr /i /r /C:- >nul 
if errorlevel 1 (
    echo "ERROR!" >&2 
    ) 

私は/C:-/C:"-"/C:"\-"/C:"\\-"で正規表現を試してみました。私はちょうどそれが一致するように見えることはできません。誰でも私が間違っていることを知っていますか?

+3

あなたはdelayedexpansionを有効にしていないと思われますので、 'echo!dash!'は文字通りエコーされます。 'echo - | findstr/C:" - "'または 'echo%dash%| findstr/C:" - "' ' – LotPings

+0

...または何らかの理由で遅延拡張を主張すると' cmd/V/Cエコー^!ダッシュ^! | findstr/I/C: " - " ';ところで、リテラル文字 '-'を検索するときに'/R'オプション(正規表現なし)を削除する必要があります。 'If​​ ErrorLevel 1'の代わりに' || '演算子を使うこともできます:' ... | > nul findstr/I/C: " - " || >&2 nul echo ERROR ^^! '... – aschipfl

+0

文字クラスが助けになるのだろうかと思います。ダッシュがクラス内の最初の文字、最後の文字または唯一の文字の場合は、リテラルとして扱われます。例えば: [-] –

答えて

2

は、実際には正規表現(/R)を使用する必要はありませんが、あなたはリテラル検索文字列-を使用することができます。また、大文字と小文字の区別がない(/I)文字以外の文字ではあまり意味がありません。

とにかく、私はあなたがそれを使用しようとしているが、あなたのコードに問題が、あなたはdelayed expansionが有効になっていないということですので、echo !dash!が実際に文字通り!dash!をエコーと思います。

  1. 置きsetlocal EnableDelayedExpansionあなたのコードおよび(オプション)バッチファイルを実行し、親cmdインスタンス内の遅延拡張を可能にするために、それの後にendlocalを配置する前に:

    はそれを解決するために、いくつかのオプションがあります、このような:

    setlocal EnableDelayedExpansion 
    set "dash=-" 
    echo(%dash% 
    echo(!dash!| > nul findstr /C:"-" || >&2 echo ERROR^^! 
    endlocal 
    
  2. 拡大を遅らせていませんどちらかの側には2つの新しいcmdのインスタンスを開始|パイプたとえ親がcmdインスタンスであっても有効です。親によって消費されていない彼らのために順番に感嘆符がエスケープされ

    set "dash=-" 
    echo(%dash% 
    cmd /V /C echo(^!dash^!| > nul findstr /C:"-" || >&2 echo ERROR! 
    

    ^!):ただし、明示的に有効に遅れ展開とパイプの左側(/V)上の別のcmdのインスタンスを開始することができます遅延拡張が有効になっている場合のインスタンスcmdもしそうでなければ、エスケープは損害を与えません。上記のコードの断片で

、私は、さらに次のように変更:これは意図しない末尾のホワイトスペースを防止などにも特殊文字を受け入れ最も安全な構文であるよう

  • set dash=-は、set "dash=-"となっています^,&,(,),<,>および|;
  • echo.は、奇妙に見えますが、唯一信頼できる構文であるecho(になりました。
  • パイプ|の前のスペースが消えてしまったため、エコーされている可能性もあります。
  • if ErrorLevel 1は、条件付きコマンド連結演算子||に置き換えられています。これにより、エラーが発生した場合、または前のコマンドの終了コードがゼロでなかった場合にのみ、次のコマンドを実行できます。
  • echo "ERROR!" >&2は引用符""とも反響する>&2SPACEを避けるために>&2 echo ERROR^^!または>&2 echo ERROR!に変更されました。遅延拡張が有効になっている場合に表示するには、!のダブルエスケープが必要です。
関連する問題