我正在用findstr
和/r
标志进行一些stringvalidation,以允许使用正则expression式。 特别是我想validation整数。
正则expression式
^[0-9][0-9]*$
为非负数工作良好,但由于我现在支持负数,以及我试过
^([1-9][0-9]*|0|-[1-9][0-9]*)$
对于正整数或负整数或零。
正则expression式在理论上运行良好。 我在PowerShell中testing它,它匹配我想要的。 但是,与
findstr /r /c:"^([1-9][0-9]*|0|-[1-9][0-9]*)$"
它没有。
虽然我知道findstr
没有最先进的正则expression式支持(甚至在Notepad ++下面,这可能是一个相当大的成就),但我期望这样简单的expression式能够工作。
任何想法我在这里做错了吗?
这适用于我:
findstr /r "^[1-9][0-9]*$ ^-[1-9][0-9]*$ ^0$"
如果不使用/c
选项,则<Strings>
参数将被视为空格分隔的搜索字符串列表 ,这将使空间成为|
构造。 (只要你的正则表达式不包含空格,就是。)
呃,我应该更好地阅读文档 。 findstr
显然不支持findstr
( |
)。
所以我可能会回到多个调用或最终用一个自定义分析器替换整个事情。
这就是我现在所做的:
set ERROR=1 rem Test for zero echo %1|findstr /r /c:"^0$">nul 2>&1 if not errorlevel 1 set ERROR= rem Test for positive numbers echo %1|findstr /r /c:"^[1-9][0-9]*$">nul 2>&1 if not errorlevel 1 set ERROR= rem Test for negative numbers echo %1|findstr /r /c:"^-[1-9][0-9]*$">nul 2>&1 if not errorlevel 1 set ERROR=
或者如果可以的话,下载grep for windows。 。 比findstr
提供的更多的功能。
一个简单的regex
可以实现相同的事情,只需要在原始表达式的开头添加一个可选的减号:
^-?[0-9][0-9]*$
我意识到这是一个非常古老的帖子,但认为它可能会在未来,所以我很快就黑了一个更先进的批处理解决方案。 通常我只会使用powershell,python,ruby或vbs。 在批处理语言中这是一个更具挑战性的问题,但为什么呢? 😛
@ECHO OFF REM The _Ignore_ variable ignores text turning search if needed SET _Ignore_=Ignore_something_if_you_need REM Set the _Debug_ variable if you want to see all the output. SET _Debug_= REM Save this as a batch file and test it by passing REM Usage: REM Example 1: REM IsItTextOrIsItANumberRegxExample.bat 123 REM Results:Found Number:"123" REM Example 2: REM IsItTextOrIsItANumberRegxExample.bat Michael123 REM Results:Found Number:"Michael123" CALL:--CheckString %1 GOTO :Done :--CheckString SET __CheckString__=%~1 SET _RETURN_LETTERS_="" SET _RETURN_NUMBERS_="" REM Using EnableDelayedExpansion to more completely Expand the for loop results and pack in the results. SETLOCAL ENABLEDELAYEDEXPANSION FOR /F "tokens=1*" %%A IN ('Echo %__CheckString__%^|findstr /r "^[1-9][0-9]*$ ^-[1-9][0-9]*$ ^0$"') DO ( IF DEFINED _Debug_ ECHO Debug:%%A If %ERRORLEVEL% EQU 0 ( IF NOT "%%A"=="%_Ignore_%" ( IF NOT "%%A"==" " ( SET __ReturnNumber__=%%A SET __ReturnNumber__=!__ReturnNumber__: =! ) ) ) ) ENDLOCAL && SET _RETURN_NUMBERS_=%__ReturnNumber__% REM Note: SETLOCAL is used twice because sometimes variable output will add spaces when using two similar for loops. SETLOCAL ENABLEDELAYEDEXPANSION FOR /F "tokens=1*" %%A IN ('Echo %__CheckString__%^|findstr /r "^[az][AZ]*[0-9]*"') DO ( IF DEFINED _Debug_ ECHO DEBUG:%%A If %ERRORLEVEL% EQU 0 ( IF NOT "%%A"=="%_Ignore_%" ( IF NOT "%%A"==" " ( SET __ReturnLetters__=%%A ) ) ) ) ENDLOCAL && SET _RETURN_LETTERS_=%__ReturnLetters__% GOTO:EOF :Done IF DEFINED _RETURN_NUMBERS_ ECHO Found Number:"%_RETURN_NUMBERS_%" IF DEFINED _RETURN_LETTERS_ ECHO Found Letters:"%_RETURN_LETTERS_%" REM Cleanup: SET _Ignore_= SET _RETURN_NUMBERS_= SET _RETURN_LETTERS_= SET _Ignore_= SET _Debug_=