在 cmd.exe 中编写最近的一些脚本时,我需要使用findstr
使用正则表达式 - 客户需要标准 cmd.exe 命令(无 GnuWin32、Cygwin、VBS 或 Powershell)。
我只是想知道变量是否包含任何大写字符并尝试使用:
> set myvar=abc
> echo %myvar%|findstr /r "[A-Z]"
abc
> echo %errorlevel%
0
When %myvar%
被设定为abc
,实际上输出字符串并设置errorlevel
为 0,表示找到匹配项。
然而,完整列表变体:
> echo %myvar%|findstr /r "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"
> echo %errorlevel%
1
does not输出该行并正确设置errorlevel
to 1.
此外:
> echo %myvar%|findstr /r "^[A-Z]*$"
> echo %errorlevel%
1
也按预期工作。
我明显失踪了某物即使这只是事实findstr
不知何故被打破了。
为什么第一个(范围)正则表达式在这种情况下不起作用?
还有更奇怪的事情:
> 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]"
上面最后两个也没有输出字符串!
我相信这主要是一个可怕的设计缺陷。
我们都希望范围能够根据 ASCII 代码值进行整理。但它们没有 - 相反,范围基于几乎与 SORT 使用的默认序列匹配的排序规则序列。EDIT - FINDSTR 使用的确切排序顺序现在可在https://stackoverflow.com/a/20159191/1012053 https://stackoverflow.com/a/20159191/1012053在标题为正则表达式字符类范围 [x-y]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)