- OpenTofu 语言
- 函数
- regex
regex
函数
regex
将 正则表达式 应用于字符串并返回匹配的子字符串。
regex(pattern, string)
regex
的返回值类型取决于模式中是否有捕获组。
- 如果模式根本没有捕获组,则结果是一个字符串,包含模式整体匹配的子字符串。
- 如果模式有一个或多个*未命名*的捕获组,则结果是捕获的子字符串列表,顺序与捕获组定义的顺序相同。
- 如果模式有一个或多个*命名*的捕获组,则结果是捕获子字符串的映射,使用捕获组名称作为映射键。
在同一个模式中混合使用命名和未命名的捕获组是无效的。
如果给定的模式根本不匹配,则 regex
会引发错误。要*测试*给定模式是否匹配字符串,请使用 regexall
并测试结果的长度是否大于零。
模式是一个字符串,包含文字字符和特殊匹配运算符的混合,如以下表格中所述。请注意,在 OpenTofu 语言中将正则表达式模式作为文字引号字符串给出时,引号字符串本身已经使用反斜杠 \
作为字符串的转义字符,因此任何打算被识别为模式一部分的反斜杠必须转义为 \\
。
序列 | 匹配 |
---|---|
. | 除换行符以外的任何字符 |
[xyz] | 方括号之间列出的任何字符(本例中为 x 、y 和 z ) |
[a-z] | a 到 z 之间的任何字符,包括 a 和 z 本身 |
[^xyz] | 与 [xyz] 相反 |
\d | ASCII 数字(0 到 9,包括 0 和 9 本身) |
\D | 除 ASCII 数字以外的任何字符 |
\s | ASCII 空格(空格、制表符、换行符、回车符、换页符) |
\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} 相反 |
xy | x 后紧跟着 y |
x|y | x 或 y ,优先选择 x |
x* | 零个或多个 x ,优先选择更多 |
x*? | 零个或多个 x ,优先选择更少 |
x+ | 一个或多个 x ,优先选择更多 |
x+? | 一个或多个 x ,优先选择更少 |
x? | 零个或一个 x ,优先选择一个 |
x?? | 零个或一个 x ,优先选择零个 |
x{n,m} | x 的 n 到 m 次重复,优先选择更多 |
x{n,m}? | x 的 n 到 m 次重复,优先选择更少 |
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.
相关函数
如果 OpenTofu 已经有一个更专门的函数来解析您要尝试匹配的语法,请优先使用该函数。正则表达式可能难以阅读,并且会掩盖您的意图,从而使配置更难阅读和理解。