Windows CMD 的 FINDSTR 命令在正则表达式匹配方面存在问题

9

我需要检查一个字符串中是否包含除数字以外的任何字符。但是我遇到了问题。

echo bdfbdfd | findstr /R [^0123456789]

返回值为空,但它应该返回bdfbdfd。但是

echo 123 | findstr /R [^0123456789]

返回'123'。为什么?它应该反过来工作。


我也无法让它在XP上工作。[^...]这个负字符类似乎是有问题的。我以为可能是转义或引用的问题,但找不到任何可行的解决方法。 - dan1111
3个回答

8

经过大量测试,我们终于找到了解决方案:

echo 123 | findstr /R "[^0123456789]"
        ^ this space is what is matched, remove it and it won't match anything

另一种方法是(如Christian.K所述)转义^,因此写为:
echo 123| findstr /R [^^0123456789]

注意到 ^^ 这一部分。

对于 bdfbdfd 部分,在第二个正则表达式两侧加上双引号并删除空格,就能使它在指定的字符串中起作用。

编辑:

请注意你正在匹配单个字符。在这个匹配中。

echo bdfbdfd | findstr /R [^0123456789]

没有任何匹配项,因为您的字符串中没有包含任何数字(不算需要转义的^)。在

echo 123 | findstr /R [^0123456789]

您正在匹配第一个数字。使用您的正则表达式,将匹配任何包含单个匹配项的字符串,因此尝试使用正则表达式[^^0123456789]123(space)进行匹配将输出整个字符串作为匹配项,因为字符串末尾有非数字字符。


(我认为动机在Christian K的回答中 :)) - Gabber

3

^CMD.EXE 的转义字符。

你需要用另一个来进行转义:

   echo xxxx | findstr /R [^^0123456789]

或者在模式周围使用引号:

   echo xxxx | findstr /R "[^0123456789]"
更新: 实际上下面的部分是错误的,因为你要查找的是“除数字以外的任何内容”。下面的内容将无法处理像“1x”这样的输入字符串,其中明显包含一个数字以外的其他内容。所以,最好的解决方案可能是使用@Gabber建议的方法,即在管道符号前去掉空格。
   echo xxxx| findstr /R "[^0-9]"

此外,您需要删除|(管道)前面的空格(请参见@Gabber的答案),或确保模式从行首开始匹配(您有几个选项):

   echo xxxx | findstr /R "^[^0123456789]"
   echo xxxx | findstr /R ^^[^^0123456789]
   echo xxxx | findstr /B /R "[^0123456789]"
   echo xxxx | findstr /B /R ^^[^^0123456789]

最后,您可以使用[0-9]而不是列出所有数字来缩短模式:

   echo xxxx | findstr /B /R "[^0-9]"

你仍然可以将模式压缩到 [0-9]

   echo xxxx| findstr /R "[^0-9]"

0
也许当你将字符串捕获到变量中并且在匹配或不匹配的情况下有选项时,可以尝试这个:
echo.%Name% | findstr /R [^0-9]Nul && (
  echo There was a match in Name variable contents
) || (
  echo Match Not Found
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接