Windows CMD FINDSTR错误的正则表达式匹配

时间:2012-10-01 08:05:46

标签: regex windows batch-file cmd

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

echo bdfbdfd | findstr /R [^0123456789]

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

echo 123 | findstr /R [^0123456789]

返回'123'。为什么?反之亦然。

3 个答案:

答案 0 :(得分: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]匹配将输出整个字符串作为匹配项,因为该字符串中包含非数字字符。字符串的结尾。

答案 1 :(得分: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]"

答案 2 :(得分:0)

也许你可以在捕获变量中的String时尝试这个,并且在匹配的情况下有关于该怎么做的选项:

echo.%Name% | findstr /R [^0-9]Nul && (
  echo There was a match in Name variable contents
) || (
  echo Match Not Found
)