While writing some recent scripts in cmd.exe, I had a need to use findstr
with regular expressions - customer required standard cmd.exe commands (no GnuWin32 nor Cygwin nor VBS nor Powershell).
I just wanted to know if a variable contained any upper-case characters and attempted to use:
> set myvar=abc
> echo %myvar%|findstr /r "[A-Z]"
abc
> echo %errorlevel%
0
When %myvar%
is set to abc
, that actually outputs the string and sets errorlevel
to 0, saying that a match was found.
However, the full-list variant:
> echo %myvar%|findstr /r "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"
> echo %errorlevel%
1
does not output the line and it correctly sets errorlevel
to 1.
In addition:
> echo %myvar%|findstr /r "^[A-Z]*$"
> echo %errorlevel%
1
also works as expected.
I'm obviously missing something here even if it's only the fact that findstr
is somehow broken.
Why does the first (range) regex not work in this case?
And yet more weirdness:
> echo %myvar%|findstr /r "[A-Z]"
abc
> echo %myvar%|findstr /r "[A-Z][A-Z]"
abc
> echo %myvar%|findstr /r "[A-Z][A-Z][A-Z]"
> echo %myvar%|findstr /r "[A]"
The last two above also does not output the string!!