9

我需要检查一个字符串是否包含除数字之外的任何内容。但我有一个问题。

echo bdfbdfd | findstr /R [^0123456789]

什么都不返回,但它应该返回 bdfbdfd。但

echo 123 | findstr /R [^0123456789]

返回“123”。为什么?它应该反之亦然。

4

3 回答 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]

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

于 2012-10-01T08:31:35.053 回答
3

是的^转义字符CMD.EXE

你需要用另一个来逃避它:

   echo xxxx | findstr /R [^^0123456789]

或在模式周围使用引号:

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

更新:实际上以下部分是错误的,因为您正在寻找“除数字之外的任何其他内容”。以下不适用于像“1x”这样的输入字符串,它显然包含除数字之外的其他内容。因此,可能最好的解决方案是使用@Gabber 建议的方法,即去掉管道前的空间。

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

此外,您需要删除 (pipe) 之前的空格(请参阅@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]"
于 2012-10-01T08:29:00.610 回答
0

也许您可以在捕获变量中的字符串时尝试此操作,并在匹配或不匹配的情况下设置选项:

echo.%Name% | findstr /R [^0-9]Nul && (
  echo There was a match in Name variable contents
) || (
  echo Match Not Found
)
于 2015-11-18T21:49:18.677 回答