批处理中的正则表达式模式与子模式不匹配

Posted

技术标签:

【中文标题】批处理中的正则表达式模式与子模式不匹配【英文标题】:Regex pattern in batch is not matching subpatterns 【发布时间】:2020-12-26 11:36:21 【问题描述】:

我正在尝试将值 ABC-2131ABC-345,DEF-3534EFG-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] 这样的字符类也可能匹配一些特殊字符,如23,具体取决于当前代码页; 为防止此类问题,您需要避免字符范围并指定每个可能的字符,例如[0123456789];但请记住搜索字符串的长度有限;

【讨论】:

以上是关于批处理中的正则表达式模式与子模式不匹配的主要内容,如果未能解决你的问题,请参考以下文章

浅谈正则表达式匹配模式—贪婪模式

快速学习正则表达式,不用死记硬背,示例让你通透(上篇)

趣玩Python第16关:3个技巧掌握正则

剑指offer-正则表达式匹配

浅谈正则表达式匹配模式—懒惰模式

正则表达式基础