【问题标题】:Trying to extract a GUID from a text, using batch (findstr + regexp)尝试使用批处理(findstr + regexp)从文本中提取 GUID
【发布时间】:2018-05-17 11:59:30
【问题描述】:

我想使用批处理从变量中提供的文本中分离出一个特定的字符串,但它似乎没有按预期工作。我可能做错了正则表达式,或者我误解了“findstr”的工作方式。

我需要隔离的特定字符串是一个 GUID(它具有字母数字字符的标准格式,以“-”分隔的字符组排列,如下所示:8-4-4-4-12)

@echo off
setlocal enabledelayedexpansion

SET str="This is a string that has a long uuid: (UUID: 359f975d-2649-4e20-b7c0-b452aaaca4b2)"
SET rx=[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12}

 FOR %%u IN ('FINDSTR /r "!rx!" "!str!"') DO ECHO %%u

endlocal

基本上,我需要将 GUID 存储在一个单独的变量中,以便以后使用。如果这可以通过不同的方式实现,我很高兴学习!

谢谢!

【问题讨论】:

    标签: regex batch-file batch-processing findstr


    【解决方案1】:
    @ECHO Off
    SETLOCAL
    SET "str=This is a string that has a long uuid: (UUID: 359f975d-2649-4e20-b7c0-b452aaaca4b2)"
    
    :: Theoretical
    
    SET "hn=[a-f0-9]"
    SET "hn4=%hn%%hn%%hn%%hn%"
    SET "hn8=%hn4%%hn4%"
    SET "wrx=%hn8%-%hn4%-%hn4%-%hn4%-%hn8%%hn4%"
    :again
    IF NOT DEFINED str ECHO notfound&GOTO done
    ECHO %str%|FINDSTR /b /r /i "%wrx%">NUL
    IF ERRORLEVEL 1 (
     REM did not find string
     SET "str=%str:~1%"
     GOTO again
    )
    SET "str=%str:~0,36%"
    ECHO found "%str%"
    
    :done
    
    :: BFI method
    
    SET "str=This is a string that has a long uuid: (UUID: 359f975d-2649-4e20-b7c0-b452aaaca4b2)"
    SET "hn=[a-f0-9]"
    SET "hn4=%hn%%hn%%hn%%hn%"
    SET "hn8=%hn4%%hn4%"
    
    :bfiagain
    IF NOT DEFINED str ECHO notfound&GOTO donebfi
    :: "regex" using brute-force and ignorance
    ECHO %str:~0,9%|FINDSTR /b /i /r  "%hn8%-">NUL
    IF ERRORLEVEL 1 GOTO bfino
    ECHO %str:~9,5%|FINDSTR /b /i /r  "%hn4%-">NUL
    IF ERRORLEVEL 1 GOTO bfino
    ECHO %str:~14,10%|FINDSTR /b /i /r  "%hn4%-%hn4%-">NUL
    IF ERRORLEVEL 1 GOTO bfino
    ECHO %str:~24,12%|FINDSTR /b /i /r  "%hn4%%hn8%">NUL
    :bfino
    IF ERRORLEVEL 1 (
     SET "str=%str:~1%"
     GOTO bfiagain
    )
    SET "str=%str:~0,36%"
    ECHO found "%str%"
    
    :donebfi
    
    GOTO :EOF
    

    嗯,没那么紧……

    从根本上说,findstr 实现了regex 的一个非常小的子集。它旨在定位文件中的字符串。

    理论上,您可以将[a-f0-9] 串在一起所需的次数,并添加- 分隔符用作“正则表达式”,然后查看主题字符串/b(开头)是否具有这样的模式;如果没有,则删除起始字符并重复直到找到或主题字符串为空。

    注意:我相信 GUID 仅使用 HEX 数字,而不是字母数字。 findstr 支持 /i 进行不区分大小写的比较(这会缩短单个“字符匹配”字符串)。是的 - 我知道^ 可以在regex 中使用(甚至是比尔叔叔的小程序员工具集中的一个),但我更喜欢/b

    唯一的小问题是它产生了out of memory 错误...

    所以,一次喂它一小块,它看起来很开心...

    我没有做进一步的测试,如果你的文本字符串包含 cmd 认为是特殊字符的字符,我没有做进一步的测试,并预测暴风雨天气 - 通常的嫌疑人,如重定向器、% 和兔子的耳朵。

    【讨论】:

    • 谢谢!经过更多阅读,我明白为什么会发生这种情况。 findstr 的正则表达式限制为 254 个字节(每行)。因此,这可以解释两个错误:“内存不足”和“字符串太长”。它还解释了为什么喂它更小的块会让 findstr 工作。
    猜你喜欢
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多