【问题标题】:Extract a pattern from string using regular exp in batch script在批处理脚本中使用常规 exp 从字符串中提取模式
【发布时间】:2017-06-18 08:14:39
【问题描述】:

我想从批处理脚本中的给定字符串中提取基于模式的子字符串。

例子:

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]+

如何在批处理脚本中实现这个???我尝试使用 'For' 和 'findstr' 来实现相同的功能,但没有这样做。

【问题讨论】:

  • 您要查找的子字符串是否总是被连字符包围 -
  • 它可能会也可能不会。
  • findstr 搜索子字符串,但它返回每个包含匹配项的;而且findstr不支持元字符+,所以[0-9]+必须写成[0-9][0-9]*。所以基本上,想要的字符串包含在非数字字符中?
  • @aschipfl 你可能会这样认为。但是想要的字符串两边包含的非数字字符可能不一样。

标签: regex windows batch-file


【解决方案1】:

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

确实有很好的支持的本地 Windows 脚本语言。 PowerShell 确实如此,JScript 和 VBScript(可通过 CSCRIPT 获得)也是如此。

如果您真的想从批处理文件中获得基于纯脚本的正则表达式解决方案,那么您可以使用JREPL.BAT。它是混合批处理/JScript,可以方便地将 JScript 正则表达式的强大功能带入批处理世界。

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

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

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

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

@echo off
setlocal
set "str=ABCDEF-x32-32.12.20-298-date-20-12-17.exe"

:: Extract the string and print to the screen
call jrepl "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+" "" /match /s str

:: Extract the string and store it in variable out.
call jrepl "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+" "" /match /s str /rtn out

【讨论】:

    猜你喜欢
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 2013-11-04
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多