首页 > 解决方案 > 我如何正则表达式匹配这 3 个场景?

问题描述

我有很多自动化运行一些 Azure 部署命令,我需要支持用引号包裹的值,而根本没有。它需要支持lookahead 和lookbehind。它在 Powershell 中运行,因此受支持。

我可以提取示例 1 和 2 OK 但不是第三个,而无需在每次捕获后运行条件和单独的正则表达式。我将如何在一个查询中匹配这个?

当前正则表达式:https ://regex101.com/r/qgX6aQ/​​1:(?<= --resource-group ['"])(.*?)(?=['" ])

在这个例子中,我需要提取RGName

  1. az vm create --resource-group "RGName" --name 'VMName'
  2. az vm create --resource-group 'RGName' --name VMName
  3. az vm create --resource-group RGName --name "VMName"

标签: regex

解决方案


要获得匹配,您不需要向后看,您可以匹配它。

您可以使用命名的捕获组,例如value. 要将开始的单引号或双引号与结束的单引号或双引号匹配,您还可以使用带有反向引用的捕获组\1

该模式要么匹配从开始到结束的单引号或双引号,要么匹配除空白字符或单引号和双引号之外的任何字符。

最后的空格也不是强制性的。

--resource-group (?:(["'])(?<value>.*?)\1|(?<value>[^\s"']+))

解释

  • --resource-group 从字面上匹配
  • (?:非捕获组
    • (["'])捕获组 1,匹配"'
    • (?<value>.*?)命名组,匹配除换行符以外的任何字符,尽可能少的字符
    • \1 对第 1 组的反向引用,匹配之前匹配的"'
    • |或者
    • (?<value>[^\s"']+)命名组,匹配 1+ 次出现的任何字符,除了空格"'
  • )关闭非捕获组

正则表达式演示

在此处输入图像描述


推荐阅读