尝试使用批处理 (findstr + regexp) 从文本中提取 GUID

Trying to extract a GUID from a text, using batch (findstr + regexp)

我想使用批处理从变量中提供的文本中分离出特定字符串,但它似乎没有按预期工作。我可能做错了正则表达式,或者我误解了 "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 存储在一个单独的变量中,以便稍后使用。如果能以不同的方式实现,我很乐意学习!

谢谢!

@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]串到需要的次数,然后加上-分隔符作为"regex",然后看主题串是否[=15] =](开始)以这样的模式;如果没有则去掉起始字符并重复直到找到或主题字符串为空。

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

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

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

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