【问题标题】:Extract a substring using AHK regex matching使用 AHK 正则表达式匹配提取子字符串
【发布时间】:2020-12-15 05:12:54
【问题描述】:

我无法找到这个问题的解决方案。不举例子很难正确提问。

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

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

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

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

【问题讨论】:

    标签: regex autohotkey


    【解决方案1】:

    是的,这是非常可行的。
    使用捕获组将很容易做到(AHK documentation | General Regex tutorial)

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

    当我们在 AHK 中使用这个 Regex 时,我们将希望以 O) 开始模式 (请参阅 OutputVar 模式 3) 以指示我们正在输出 match object
    然后我们可以使用例如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!"
    

    或者,不使用捕获组,您可以使用环视来仅匹配您想要的两个数字。在这种情况下,您也不会输出匹配对象。
    就我个人而言,我会说捕获组会是更好/更常见的方法,它们绝对值得学习,但如果你有兴趣,也可以看看这里:(?<=2020)\d{2}

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

    【讨论】:

      猜你喜欢
      • 2022-10-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多