尝试使用批处理 (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
视为特殊的字符,我会预测暴风雨天气 - 通常的嫌疑人如重定向器、%
和兔耳。
我想使用批处理从变量中提供的文本中分离出特定字符串,但它似乎没有按预期工作。我可能做错了正则表达式,或者我误解了 "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
视为特殊的字符,我会预测暴风雨天气 - 通常的嫌疑人如重定向器、%
和兔耳。