批处理中的正则表达式模式与子模式不匹配
Posted
技术标签:
【中文标题】批处理中的正则表达式模式与子模式不匹配【英文标题】:Regex pattern in batch is not matching subpatterns 【发布时间】:2020-12-26 11:36:21 【问题描述】:我正在尝试将值 ABC-2131
和 ABC-345,DEF-3534
和 EFG-456,FGF-4546,HJI-23423
与批处理脚本中的 RegEx 进行匹配
^([aA-zZ]*-[0-9]*)([,]*[aA-zZ]*-[0-9]*)*
批处理脚本中的正则表达式子模式没有正确匹配
例如在子模式分组中,^([aA-zZ]*-[0-9]*)
仅对(ABC-234)
有效,对ABC-234
无效
代码如下:
echo(%LogMsg%|findstr /r /c:"^([aA-zZ]*-[0-9]*)([,]*[aA-zZ]*-[0-9]*)*" >nul && (
echo FOUND
) || (
(echo NOT FOUND )
)
【问题讨论】:
你可以试试:^[a-zA-Z]+-[0-9]+(?:,[a-zA-Z]+-[0-9]+)*$
没有。我只需要匹配 ABC-2131 或 ABC-345,DEF-3534
是的,我试过了。这对 ABC-342 不起作用
这是不正确的。看这个演示:regex101.com/r/JhHvxR/1 它匹配你所有的输入字符串。
可能不支持?:
,试试^[a-zA-Z]+-[0-9]+(,[a-zA-Z]+-[0-9]+)*$
【参考方案1】:
findstr
command 仅支持非常小的正则表达式摘录。此外,搜索表达式的长度非常有限。
一种可能的方法是让for
loop以逗号分隔字符串,这构成了一个标准的标记分隔符,然后检查每个迭代的项目是否符合一定的模式:
@echo off
rem // Assign sample string:
set "LogMsg=ABC-2131,ABC-345,DEF-3534,EFG-456,FGF-4546,HJI-23423"
rem /* Assign string to `for` meta-variable, just to protect potential
rem special characters without using delayed variable expansion: */
for %%J in ("%LogMsg%") do (
rem /* Loop through comma-separated items
rem (actually, any sequence consisting of SPACE, TAB, `,`, `;`,
rem `=`, VTAB, FF, NBSP is treated as a token separator): */
for %%I in (%%~J) do (
rem // Assign current item to variable:
set "ITEM=%%I"
rem // Match item against predefined pattern:
cmd /V /C echo(!ITEM!| findstr /I "^[A-Z][A-Z][A-Z]-[0-9][0-9]*$" || goto :SKIP
)
)
rem // This point is reached when all items match:
echo FOUND
exit /B
rem // This point is reached when any item does not match:
:SKIP
echo NOT FOUND
关于findstr
有一些缺陷:
[A-Z]
也匹配小写字母(z
除外),所以我决定做一个不区分大小写的搜索(/I
);
像[A-z]
这样的字符类也可以匹配Å
、à
等特殊字母,具体取决于当前代码页;
像[0-9]
这样的字符类也可能匹配一些特殊字符,如2
、3
,具体取决于当前代码页;
为防止此类问题,您需要避免字符范围并指定每个可能的字符,例如[0123456789]
;但请记住搜索字符串的长度有限;
【讨论】:
以上是关于批处理中的正则表达式模式与子模式不匹配的主要内容,如果未能解决你的问题,请参考以下文章