メインコンテンツにスキップ

regex 関数

regex は、正規表現 を文字列に適用し、一致する部分文字列を返します。

コードブロック
regex(pattern, string)

regex の戻り値の型は、パターンにキャプチャグループがあるかどうか、そしてどのようなキャプチャグループがあるかによって異なります。

  • パターンにキャプチャグループが全くない場合、結果はパターン全体と一致する部分文字列をカバーする単一の文字列になります。
  • パターンに1つ以上の*名前のない*キャプチャグループがある場合、結果はキャプチャされた部分文字列のリストで、キャプチャグループの定義と同じ順序になります。
  • パターンに1つ以上の*名前付き*キャプチャグループがある場合、結果はキャプチャされた部分文字列のマップで、キャプチャグループ名がマップキーとして使用されます。

同じパターンに名前付きキャプチャグループと名前のないキャプチャグループを混在させることはできません。

指定されたパターンが全く一致しない場合、regex はエラーを発生させます。指定されたパターンが文字列と一致するかどうかを*テスト*するには、regexall を使用し、結果の長さがゼロより大きいかどうかをテストします。

パターンは、リテラル文字と特殊な一致演算子を組み合わせた文字列で、以下の表に示すように記述されます。OpenTofu 言語で正規表現パターンをリテラル引用符付き文字列として指定する場合、引用符付き文字列自体が既にバックスラッシュ \ を文字列のエスケープ文字として使用しているため、パターンの一部として認識されることを意図したバックスラッシュは \\ としてエスケープする必要があることに注意してください。

シーケンス一致対象
.改行文字を除く任意の文字
[xyz]括弧内にリストされている任意の文字(この例では xyz
[a-z]a から z までの任意の文字(両端を含む)
[^xyz][xyz] の逆
\dASCII 数字(0 から 9 まで、両端を含む)
\DASCII 数字以外のすべて
\sASCII スペース(スペース、タブ、改行、キャリッジリターン、フォームフィード)
\SASCII スペース以外のすべて
\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|yxまたはyのいずれか。xが優先される
x*ゼロ個以上のx。より多い方が優先される
x*?ゼロ個以上のx。より少ない方が優先される
x+1つ以上のx。より多い方が優先される
x+?1つ以上のx。より少ない方が優先される
x?ゼロ個または1つのx。1つの方が優先される
x??ゼロ個または1つのx。ゼロの方が優先される
x{n,m}xの繰り返しがn回からm回。より多い方が優先される
x{n,m}?xの繰り返しがn回からm回。より少ない方が優先される
x{n,}xの繰り返しが少なくともn回。より多い方が優先される
x{n,}?xの繰り返しが少なくともn回。より少ない方が優先される
x{n}xの繰り返しがちょうどn
(x)サブパターンxの名前のないキャプチャグループ
(?P<name>x)nameという名前の、サブパターンxの名前付きキャプチャグループ
(?:x)キャプチャされないサブパターンx
\*任意の句読点文字*を表すリテラル*
\Q...\Eリテラルに\Eが含まれていない限り、任意のテキスト...を表すリテラル...

一致する文字を消費する上記のマッチング演算子に加えて、*一致のみを行い、文字を消費しない*演算子があります。これらは「ゼロ幅」マッチング演算子です

シーケンス一致対象
^指定された文字列の先頭
$指定された文字列の末尾
\A指定された文字列の先頭
\z指定された文字列の末尾
\bASCII単語境界(\w\W\A\zのいずれかとの間の遷移、またはその逆)
\BASCII単語境界ではない

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に、一致させようとしている構文を解析するためのより特殊な関数が既に存在する場合は、代わりにその関数を使用することをお勧めします。正規表現は読みにくく、意図を分かりにくくすることがあり、構成の可読性と理解度を低下させる可能性があります。