Regex 在批处理脚本中使用正则表达式从字符串中提取模式

Regex 在批处理脚本中使用正则表达式从字符串中提取模式,regex,windows,batch-file,Regex,Windows,Batch File,我想根据模式从批处理脚本中的给定字符串中提取一个子字符串 例如: Input : ABCDEF-x32-32.12.20-298-date-20-12-17.exe Required Output : 32.12.20-298 (i.e. <number>.<number>.<number>-<number>) Regex (may be) : [0-9]+\.[0-9]+\.[0-9]+-[0-9]+ 输入:ABCDEF-x32-32.1

我想根据模式从批处理脚本中的给定字符串中提取一个子字符串

例如:

Input :  ABCDEF-x32-32.12.20-298-date-20-12-17.exe
Required Output : 32.12.20-298  (i.e. <number>.<number>.<number>-<number>)
Regex (may be)  : [0-9]+\.[0-9]+\.[0-9]+-[0-9]+
输入:ABCDEF-x32-32.12.20-298-date-20-12-17.exe
所需输出:32.12.20-298(即…-)
正则表达式(可以是):[0-9]+\[0-9]+\[0-9]+-[0-9]+

如何在批处理脚本中实现此功能???我尝试使用“For”和“findstr”实现相同的功能,但没有成功。

Windows批处理没有一个好的正则表达式工具。FINDSTR命令对regex的支持非常有限(非标准,并且有漏洞)。它只能返回包含匹配项的整行

有些本机Windows脚本语言确实有很好的支持。PowerShell当然有,JScript和VBScript(可通过CSCRIPT获得)也有

如果您确实希望从批处理文件中获得一个纯粹的基于脚本的正则表达式解决方案,那么您可以使用。正是混合批处理/JScript方便地将JScript正则表达式的功能带到了批处理世界

完整文档可通过
jrepl/?
jrepl/??
获取分页帮助。另一个重要的帮助命令是
jrepl/?options
以获取所有可用选项的摘要,以及
jrepl/?help
以获取所有可用帮助的摘要

通常,JREPL用于执行查找/替换操作。但是
/MATCH
选项忽略所需的替换字符串,只输出匹配的文本

通常JREPL从stdin或文件中读取。但是
/S
选项从变量读取输入

输出通常是标准输出或文件。但是
/RTN
选项将结果保存到环境变量中(整个结果必须在8kb以内)

@echo关闭
setlocal
设置“str=ABCDEF-x32-32.12.20-298-date-20-12-17.exe”
::提取字符串并打印到屏幕上
调用jrepl“[0-9]+\.[0-9]+\.[0-9]+-[0-9]+”“”/match/s str
::提取字符串并将其存储在变量out中。
调用jrepl“[0-9]+\.[0-9]+\.[0-9]+-[0-9]+”“”/match/s str/rtn out

Windows批处理没有好的正则表达式工具。FINDSTR命令对regex的支持非常有限(非标准,并且有漏洞)。它只能返回包含匹配项的整行

有些本机Windows脚本语言确实有很好的支持。PowerShell当然有,JScript和VBScript(可通过CSCRIPT获得)也有

如果您确实希望从批处理文件中获得一个纯粹的基于脚本的正则表达式解决方案,那么您可以使用。正是混合批处理/JScript方便地将JScript正则表达式的功能带到了批处理世界

完整文档可通过
jrepl/?
jrepl/??
获取分页帮助。另一个重要的帮助命令是
jrepl/?options
以获取所有可用选项的摘要,以及
jrepl/?help
以获取所有可用帮助的摘要

通常,JREPL用于执行查找/替换操作。但是
/MATCH
选项忽略所需的替换字符串,只输出匹配的文本

通常JREPL从stdin或文件中读取。但是
/S
选项从变量读取输入

输出通常是标准输出或文件。但是
/RTN
选项将结果保存到环境变量中(整个结果必须在8kb以内)

@echo关闭
setlocal
设置“str=ABCDEF-x32-32.12.20-298-date-20-12-17.exe”
::提取字符串并打印到屏幕上
调用jrepl“[0-9]+\.[0-9]+\.[0-9]+-[0-9]+”“”/match/s str
::提取字符串并将其存储在变量out中。
调用jrepl“[0-9]+\.[0-9]+\.[0-9]+-[0-9]+”“”/match/s str/rtn out

您要查找的子字符串是否总是被连字符包围
-
?它可能是,也可能不是。搜索子字符串,但返回包含匹配项的每一行;此外,
findstr
不支持元字符
+
,因此
[0-9]+
必须写成
[0-9][0-9]*
。因此,基本上,所需字符串包含在非数字字符中?@aschipfl您可以假设。但所需字符串两侧的非数字字符可能不相同。您要查找的子字符串的可能重复项是否始终用连字符包围?可能是,也可能不是。搜索子字符串,但返回包含匹配项的每一行;此外,
findstr
不支持元字符
+
,因此
[0-9]+
必须写成
[0-9][0-9]*
。因此,基本上,所需字符串包含在非数字字符中?@aschipfl您可以假设。但所需字符串两侧包含的非数字字符可能不相同。的可能重复