跳至主要内容

regex 函数

regex正则表达式 应用于字符串并返回匹配的子字符串。

代码块
regex(pattern, string)

regex 的返回值类型取决于模式中是否有捕获组。

  • 如果模式根本没有捕获组,则结果是一个字符串,包含模式整体匹配的子字符串。
  • 如果模式有一个或多个*未命名*的捕获组,则结果是捕获的子字符串列表,顺序与捕获组定义的顺序相同。
  • 如果模式有一个或多个*命名*的捕获组,则结果是捕获子字符串的映射,使用捕获组名称作为映射键。

在同一个模式中混合使用命名和未命名的捕获组是无效的。

如果给定的模式根本不匹配,则 regex 会引发错误。要*测试*给定模式是否匹配字符串,请使用 regexall 并测试结果的长度是否大于零。

模式是一个字符串,包含文字字符和特殊匹配运算符的混合,如以下表格中所述。请注意,在 OpenTofu 语言中将正则表达式模式作为文字引号字符串给出时,引号字符串本身已经使用反斜杠 \ 作为字符串的转义字符,因此任何打算被识别为模式一部分的反斜杠必须转义为 \\

序列匹配
.除换行符以外的任何字符
[xyz]方括号之间列出的任何字符(本例中为 xyz
[a-z]az 之间的任何字符,包括 az 本身
[^xyz][xyz] 相反
\dASCII 数字(0 到 9,包括 0 和 9 本身)
\D除 ASCII 数字以外的任何字符
\sASCII 空格(空格、制表符、换行符、回车符、换页符)
\S除 ASCII 空格以外的任何字符
\w[0-9A-Za-z_] 相同
\W\w 匹配的字符以外的任何字符
[[:alnum:]][0-9A-Za-z] 相同
[[:alpha:]][A-Za-z] 相同
[[:ascii:]]任何 ASCII 字符
[[:blank:]]ASCII 制表符或空格
[[:cntrl:]]ASCII/Unicode 控制字符
[[:digit:]][0-9] 相同
[[:graph:]]所有“图形”(可打印)ASCII 字符
[[:lower:]][a-z] 相同
[[:print:]][[:graph:]] 相同
[[:punct:]][!-/:-@[-`{-~] 相同
[[:space:]][\t\n\v\f\r ] 相同
[[:upper:]][A-Z] 相同
[[:word:]]\w 相同
[[:xdigit:]][0-9A-Fa-f] 相同
\pN使用单字母类名(本例中为“N”)的 Unicode 字符类
\p{Greek}使用 Unicode 名称(本例中为“Greek”)的 Unicode 字符类
\PN\pN 相反
\P{Greek}\p{Greek} 相反
xyx 后紧跟着 y
x|yxy,优先选择 x
x*零个或多个 x,优先选择更多
x*?零个或多个 x,优先选择更少
x+一个或多个 x,优先选择更多
x+?一个或多个 x,优先选择更少
x?零个或一个 x,优先选择一个
x??零个或一个 x,优先选择零个
x{n,m}xnm 次重复,优先选择更多
x{n,m}?xnm 次重复,优先选择更少
x{n,}至少 n 次重复 x,优先选择更多
x{n,}?至少 n 次重复 x,优先选择更少
x{n}恰好 n 次重复 x
(x)用于子模式 x 的无名捕获组
(?P<name>x)命名捕获组,命名为 name,用于子模式 x
(?:x)非捕获子模式 x
\*任何标点符号字符 * 的字面量 *
\Q...\E任何文本 ... 的字面量 ...,只要它不包含字面量 \E

除了以上匹配运算符之外,它们会消耗它们匹配的字符,还有一些额外的运算符仅匹配,但不消耗任何字符。这些是“零宽度”匹配运算符

序列匹配
^在给定字符串的开头
$在给定字符串的结尾
\A在给定字符串的开头
\z在给定字符串的结尾
\b在 ASCII 词边界(\w\W\A\z 之间的转换,反之亦然)
\B不在 ASCII 词边界

OpenTofu 使用 RE2 正则表达式语言。此引擎不支持某些其他正则表达式引擎中的所有功能;特别是,它不支持反向引用。

匹配标志

上面描述的一些匹配行为可以通过设置匹配标志来修改,使用 (?flags) 运算符(在当前子模式中激活)或 (?flags:x) 运算符(使用修改后的标志匹配 x)来激活。每个标志都是一个字母,可以通过在 flags 位置列出多个字母来一次设置多个标志。下表列出了可用标志

标志含义
i不区分大小写:模式中的字面量字母匹配该字母的大小写版本
m^$ 运算符还匹配字符串中以换行符为标记的行首和行尾;\A\z 的行为不变
s. 运算符还匹配换行符
U重复运算符后 ? 的存在或不存在的含义被反转。例如,x* 被解释为 x*?,反之亦然。

示例

代码块
> regex("[a-z]+", "53453453.345345aaabbbccc23454")
aaabbbccc

> regex("(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)", "2019-02-01")
[
"2019",
"02",
"01",
]

> regex("^(?:(?P<scheme>[^:/?#]+):)?(?://(?P<authority>[^/?#]*))?", "https://example.com/docs/")
{
"authority" = "example.com"
"scheme" = "https"
}

> regex("[a-z]+", "53453453.34534523454")

Error: Error in function call

Call to function "regex" failed: pattern did not match any part of the given
string.
  • regexall 在字符串中搜索给定模式的多个匹配项。
  • replace 将字符串的子字符串替换为另一个字符串,可以选择使用与 regex 相同的正则表达式语法进行匹配。

如果 OpenTofu 已经有一个更专门的函数来解析您要尝试匹配的语法,请优先使用该函数。正则表达式可能难以阅读,并且会掩盖您的意图,从而使配置更难阅读和理解。