使用AHK正则表达式匹配提取子字符串

问题描述

我无法找到此问题的解决方案。很难给出正确的答案而没有给出示例。

我有文件名。这是一个示例格式: Diagnostics 20200826-12345moretext.zip

如您所见,日期在文件名中的某个位置内置在文件名中。我想匹配“ 2020XXZZ”,但我想将XX存储到变量中。 RegExMatch有可能吗?

类似regexmatch(file_name,"202[0-9]{3}",out_var)

如果不可能的话,我想我可以从out_var提取最后一个字符,但是我希望找到正确的方法(如果存在,我认为有办法)。

解决方法

是的,这非常可行。
捕获组AHK documentation | General Regex tutorial很容易。

因此,我们可以使用像2020(\d{2})这样简单的正则表达式。
如果希望文件名是可能导致匹配错误内容的文件,则可以在正则表达式中添加更多检查。

当我们在AHK中使用此Regex时,我们将要以O) (请参见OutputVar模式3)开始模式,以指示我们正在输出{{ 3}}。
然后,我们可以使用out_var.Value(1)out_var[1]访问第一个捕获的组。

file := "Diagnostics 20200826-12345moretext.zip"

if(RegExMatch(file,"O)2020(\d{2})",out_var))
   MsgBox,% "First two numbers after ""2020"": " out_var[1]
else
   MsgBox,% "Failed to match!"

或者,要不使用捕获组,可以使用环顾四周方法仅匹配所需的两个数字。在这种情况下,您也不会输出匹配对象。
我个人说捕获组将是更好/更常见的方法,并且它们肯定是很好学习的,但是如果您有兴趣,这里也提供了环顾四周的方法:match object

file := "Diagnostics 20200826-12345moretext.zip"

if(RegExMatch(file,"(?<=2020)\d{2}",% "First two numbers after ""2020"": " out_var
else
   MsgBox,% "Failed to match!"