web-dev-qa-db-ja.com

findstrの正規表現

私はfindstrとその/rフラグは、正規表現を許可します。特に、整数を検証したいと思います。

正規表現

^[0-9][0-9]*$

負でない数値でもうまく機能しましたが、負の数値もサポートするようになりましたので、

^([1-9][0-9]*|0|-[1-9][0-9]*)$

正または負の整数またはゼロのいずれか。

正規表現は正常に動作します理論的に。 PowerShellでテストし、私が望むものと一致します。ただし、

findstr /r /c:"^([1-9][0-9]*|0|-[1-9][0-9]*)$"

そうではありません。

findstrが最も高度な正規表現をサポートしていないことは知っていますが(おそらくNotepad ++の下でもかなりの成果です)、このような単純な式が機能することを期待していました。

ここで私が間違っていることはありますか?

31
Joey

これは私のために働く:

findstr /r "^[1-9][0-9]*$ ^-[1-9][0-9]*$ ^0$"

/cオプションを使用しない場合、<Strings>引数は、スペースで区切られた検索文字列のlistとして扱われ、スペースが|コンストラクト。 (正規表現にスペースが含まれていない限り、つまり。)

47
Alan Moore

ああ、私は ドキュメント を読んでおくべきだった。 findstrは明らかに交互をサポートしていません(|)。

したがって、おそらく複数の呼び出しに戻るか、最終的にすべてをカスタムパーサーに置き換えます。

これは今のところ私がやっていることです:

set ERROR=1
rem Test for zero
echo %1|findstr /r /c:"^0$">nul 2>&1
if not errorlevel 1 set ERROR=
rem Test for positive numbers
echo %1|findstr /r /c:"^[1-9][0-9]*$">nul 2>&1
if not errorlevel 1 set ERROR=
rem Test for negative numbers
echo %1|findstr /r /c:"^-[1-9][0-9]*$">nul 2>&1
if not errorlevel 1 set ERROR=
9
Joey

または、可能であれば、 Windows用grep をダウンロードします。 findstrが提供するよりも多くの機能。

3
ghostdog74

同じことを実現するより単純なregexが可能です。元の式の先頭にオプションのマイナスを追加するだけです:

^-?[0-9][0-9]*$
1
martski

findstrの正規表現 のサポートはかなり制限されています。 Notepad ++を使用することをお勧めします。 find in filesオプションはPerl互換の正規表現をサポートしています。ファイル名、行番号、一致するテキストを示す結果は、テキストファイルに簡単にコピーできます。

0
Paulo Merson