我需要检查存储在变量中的字符串的有效性,不能使用外部CLI工具(如grep、awk等),因此我选择了FINDSTR。 该字符串的格式为(正则表达式):
([1-9][0-9]*:".*"(|".*")*)
我不知道如何检查子模式(|。*)。
目前我的代码是:
((ECHO.) | (SET /P "=(11:"a"|"b"|"c")") | (FINDSTR /R /C:"^([1-9][0-9]*:".*")$"))
敬礼。
我需要检查存储在变量中的字符串的有效性,不能使用外部CLI工具(如grep、awk等),因此我选择了FINDSTR。 该字符串的格式为(正则表达式):
([1-9][0-9]*:".*"(|".*")*)
我不知道如何检查子模式(|。*)。
目前我的代码是:
((ECHO.) | (SET /P "=(11:"a"|"b"|"c")") | (FINDSTR /R /C:"^([1-9][0-9]*:".*")$"))
敬礼。
HELP FINDSTR
或FINDSTR /?
可以获取支持的简要概述。有关详细说明,请参阅Windows FINDSTR命令的未记录功能和限制是什么?
我喜欢Harry Johnston的评论-使用VBScript或JavaScript可以很容易地创建解决方案。我认为这将是一个更好的选择。!
字符必须转义两次,以确保延迟展开发生在正确的时间。<space>
;
,
=
<tab>
*
或?
字符串。此外,每个字符串中的引号必须平衡。@echo off
setlocal
set LF=^
::Above 2 blank lines are critical for creating a linefeed variable. Do not remove
set test=a
for %%S in (
"(3:"a"|"c"|"c")"
"(11:"a"|"b"|"c"|"d"|"esdf"|"f"|"g"|"h"|"i"|"j"|"k")"
"(4:"a"|"b"|"c")"
"(10:"a"|"b"|"c"|"d"|"esdf"|"f"|"g"|"h"|"i"|"j"|"k")"
"(3:"a"|"b"|"c""
"(3:"a"|"b^|c")"
"(3:"a"|"b"|c)"
"(3:"a"|"b"||"c")"
"(3:"a"|"b"|;|"c")"
) do (
set "var=%%~S"
call :validate
)
exit /b
:validate
setlocal enableDelayedExpansion
cmd /v:on /c echo ^^^!var^^^!|findstr /r /c:"^([1-9][0-9]*:.*)$" >nul || (call :invalid FINDSTR fail& exit /b)
if "!var:||=!" neq "!var!" (call :invalid double pipe fail& exit /b)
for /f "delims=(:" %%N in ("!var!") do set "expectedCount=%%N"
set "str=!var:*:=!"
set "str=!str:~0,-1!"
set foundCount=0
for %%A in ("!LF!") do for /f eol^=^%LF%%LF%^ delims^= %%B in ("!str:|=%%~A!") do (
if %%B neq "%%~B" (call :invalid sub-pattern fail& exit /b)
set /a foundCount+=1
)
if %foundCount% neq %expectedCount% (call :invalid count fail& exit /b)
echo Valid: !var!
exit /b
:invalid
echo Invalid - %*: !var!
exit /b
运行批处理脚本后,以下是结果:
Valid: (3:"a"|"c"|"c")
Valid: (11:"a"|"b"|"c"|"d"|"esdf"|"f"|"g"|"h"|"i"|"j"|"k")
Invalid - count fail: (4:"a"|"b"|"c")
Invalid - count fail: (10:"a"|"b"|"c"|"d"|"esdf"|"f"|"g"|"h"|"i"|"j"|"k")
Invalid - FINDSTR fail: (3:"a"|"b"|"c"
Invalid - sub-pattern fail: (3:"a"|"b|c")
Invalid - sub-pattern fail: (3:"a"|"b"|c)
Invalid - double pipe fail: (3:"a"|"b"||"c")
Invalid - sub-pattern fail: (3:"a"|"b"|;|"c")
更新
通过将延迟扩展的启用推迟到CMD /V:ON
管道之后,可以简化:validate
例程。这意味着我不再需要担心管道左侧的!
被双重转义。
:validate
cmd /v:on /c echo !var!|findstr /r /c:"^([1-9][0-9]*:.*)$" >nul || (call :invalid FINDSTR fail& exit /b)
setlocal enableDelayedExpansion
... remainder unchanged
(|".*")*
是不可行的。如果您知道有多少个块并且您可以像这样复制代码,则可以解决问题。FINDSTR /R /C:"^([1-9][0-9]*:\"..*\"|\"..*\"|\"..*\")$"
""
,那么您可以进行检查。..*
结构旨在替换.+
:一个或多个字符。
cmd
无关,cscript
只是一个普通的控制台可执行文件(在企业环境中有时会被禁用)。PowerShell可以安装在XP和Vista上,但仅预装在Windows 7和8(以及相应的服务器版本)上。 - Joey