You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Terraform中通过正则匹配获取指定后缀的Azure子网?

解决方案

针对你的需求,Terraform提供了两种更合适的实现方式,无需依赖仅支持精确匹配的index函数:

方案一:使用endswith函数筛选(推荐,适合后缀匹配场景)

因为你需要匹配以指定后缀结尾的子网名称,endswith函数是最直观高效的选择,无需编写正则:

data "azurerm_virtual_network" "this" {
  name                = local.vnet
  resource_group_name = "myrg"
}

locals {
  # 筛选所有以"mgmt-1"结尾的子网
  mgmt_subnets = [for subnet in data.azurerm_virtual_network.this.subnets : subnet if endswith(subnet, "mgmt-1")]
  # 取第一个匹配的子网(假设仅存在一个符合条件的子网)
  mgmt_subnet = local.mgmt_subnets[0]

  # 同理处理以"egress-1"结尾的子网
  egress_subnets = [for subnet in data.azurerm_virtual_network.this.subnets : subnet if endswith(subnet, "egress-1")]
  egress_subnet = local.egress_subnets[0]
}

优化点:避免索引越界

如果不确定是否存在匹配的子网,可以添加长度判断,防止报错:

locals {
  mgmt_subnets = [for subnet in data.azurerm_virtual_network.this.subnets : subnet if endswith(subnet, "mgmt-1")]
  mgmt_subnet  = length(local.mgmt_subnets) > 0 ? local.mgmt_subnets[0] : null
}

方案二:使用正则匹配(适合复杂模式场景)

如果需要更灵活的匹配规则(比如包含特定前缀、中间字符等),可以用regexall函数实现:

locals {
  # 正则表达式`.*mgmt-1$`表示任意字符开头,以"mgmt-1"结尾
  mgmt_subnets = regexall(".*mgmt-1$", join("\n", data.azurerm_virtual_network.this.subnets))
  mgmt_subnet  = local.mgmt_subnets[0]
}

说明

  • join("\n", ...)将子网列表转换为换行分隔的字符串,让regexall可以逐行匹配
  • .*匹配任意数量的任意字符,$表示字符串结尾,确保仅匹配以指定后缀结尾的子网

内容的提问来源于stack exchange,提问作者fontaine4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:15:42