[comment]: # ({ef775bfd-da69ac43})

# 17 エスケープの例

[comment]: # ({/ef775bfd-da69ac43})

[comment]: # ({a44d3dec-1e84b4a7})

#### 概要

このページでは、さまざまなコンテキストで正規表現を使用する際に正しいエスケープを使用する例を示します。

:::notetip
トリガー式コンストラクターを使用すると、正規表現に正しいエスケープが自動的に追加されます。
:::

[comment]: # ({/a44d3dec-1e84b4a7})

[comment]: # ({5cc50e18-137e19de})

#### 例

**コンテキスト付きユーザーマクロ**

正規表現: `\.+\"[a-z]+`<br>
コンテキスト付きユーザーマクロ: `{$MACRO:regex:"\.+\\"[a-z]+"}`

注意:

- バックスラッシュは[エスケープされません](/manual/config/macros/user_macros_context#important-notes);
- 引用符はエスケープされます。

**アイテムキーパラメータ内のマクロ関数**

正規表現: `.+:(\d+)$`<br>
アイテムキー: `net.tcp.service[tcp,,"{{ITEM.VALUE}.regsub(\".+:(\d+)$\",\1)}"]`

注意:

- `regsub` マクロ関数内の正規表現は二重引用符で囲まれています(閉じ括弧が含まれているため)
- 正規表現を囲む引用符はエスケープされます（3番目の項目パラメータ全体が二重引用符で囲まれているため）
- 3番目の項目キーパラメータはカンマを含むため二重引用符で囲まれています。

**LLDマクロ関数**

正規表現: `\.+\"([a-z]+)`<br>
LLDマクロ: `{{#MACRO}.iregsub("\.+\\"([a-z]+)", \1)}`

注意:

- バックスラッシュはエスケープされません。
- 引用符はエスケープされます。

**ユーザーマクロコンテキスト内のLLDマクロ関数**

正規表現: `\.+\"([a-z]+)`<br>
LLDマクロ: `{{#MACRO}.iregsub("\.+\\"([a-z]+)", \1)}`<br>
コンテキスト付きユーザーマクロ: `{$MACRO:"{{#MACRO}.iregsub(\"\.+\\\"([a-z]+)\", \1)}"}`

注意:

- LLDマクロのバックスラッシュエスケープは変更されません。
- LLDマクロをユーザーマクロコンテキストに挿入する際は、以下の文字列にする必要があります。
  1. マクロ式の前後に引用符が追加されます。
  2. 引用符がエスケープされます。合計で3つの新しいバックスラッシュが導入されます。

**履歴非保持関数の文字列パラメータ**

文字列の内容: `\.+\"[a-z]+`<br>
式: `concat("abc", "\\.\\\"[a-z]+")`

注意:

- 文字列パラメータでは、バックスラッシュと引用符の両方をエスケープする必要があります。

**履歴関数の文字列パラメータ**

文字列の内容: `\.+\"[a-z]+`<br>
式: `find(__ITEM_KEY__,,"regexp","\.+\\"[a-z]+")`

注意:

- バックスラッシュはエスケープされません。
- 引用符はエスケープされます。

**履歴関数以外の文字列パラメータ内のLLDマクロ関数**

正規表現: `\.+\"([a-z]+)`<br>
LLDマクロ: `{{#MACRO}.iregsub("\.+\\"([a-z]+)", \1)}`<br>
式: `concat("abc, "{{#MACRO}.iregsub(\"\\.+\\\\\"([a-z]+)\", \\1)}")`

注意:

- 文字列パラメータでは、バックスラッシュと引用符の両方をエスケープする必要があります。
- マクロは文字列の引用符が解除された後にのみ解決されるため、エスケープ処理がさらに追加されます。

**ヒストリー関数の文字列パラメータ内のLLDマクロ関数**

正規表現: `\.+\"([a-z]+)`<br>
LLDマクロ: `{{#MACRO}.iregsub("\.+\\"([a-z]+)", \1)}`<br>
式: `find(__ITEM_KEY__,,"eq","{{#MACRO}.iregsub(\"\.+\\\"([a-z]+)\", \1)}")`

注意:

- バックスラッシュはエスケープされません。
- 引用符はエスケープされます。

**非履歴関数の文字列パラメータ内にコンテキストを持つユーザーマクロ**

正規表現: `\.+\"[a-z]+`<br>
コンテキストを持つユーザーマクロ: `{$MACRO:regex:"\.+\\"[a-z]+"}`<br>
式: `concat("abc, "{$MACRO:regex:\"\\.+\\\\\"[a-z]+\"}")`

注意:

- 前の例と同様に、追加のエスケープ処理が必要です。
- バックスラッシュと引用符は、トップレベルのエスケープ処理でのみエスケープされます。（文字列パラメータであるため）

**履歴関数の文字列パラメータ内にコンテキストを持つユーザーマクロ**

正規表現: `\.+\"[a-z]+`<br>
コンテキストを持つユーザーマクロ: `{$MACRO:regex:"\.+\\"[a-z]+"}`<br>
式: `find(__ITEM_KEY__,,"eq","{$MACRO:regex:\"\.+\\\"[a-z]+\"}")`

注意:

- バックスラッシュはエスケープされません。
- 引用符はエスケープされます。

**履歴関数以外の関数内のユーザーマクロコンテキスト内の LLD マクロ関数**

正規表現: `\.+\"([a-z]+)`<br>
LLD マクロ: `{{#MACRO}.iregsub("\.+\\"([a-z]+)", \1)}`<br>
コンテキストを持つユーザーマクロ: `{$MACRO:"{{#MACRO}.iregsub(\"\.+\\\"([a-z]+)\", \1)}"}`<br>
式: `concat("abc, "{$MACRO:\"{{#MACRO}.iregsub(\\\"\.+\\\\\\\"([a-z])+\\\", \\1)}\"}")`

エスケープの3つのレイヤーに注意してください。

1. LLDマクロ関数の場合バックスラッシュをエスケープしません。
2. コンテキスト付きユーザーマクロの場合バックスラッシュをエスケープしません。
3. 関数の文字列パラメータの場合バックスラッシュをエスケープします。

**履歴関数内のユーザーマクロコンテキスト内のLLDマクロ関数**

正規表現: `\.+\"([a-z])+`<br>
LLDマクロ: `{{#MACRO}.iregsub("\.+\\"([a-z]+)", \1)}`<br>
コンテキスト付きユーザーマクロ: `{$MACRO:"{{#MACRO}.iregsub(\"\.+\\\"([a-z]+)\", \1)}"}`<br>
式: `find(__ITEM_KEY__,,"eq","{$MACRO:\"{{#MACRO}.iregsub(\\"\.+\\\\"([a-z])+\\", \1)}\"}")`

注意:

- バックスラッシュはエスケープされません。
- 引用符はエスケープされます。

**文字列のすぐ内側にコンテキストがあるユーザーマクロ**

正規表現: `\.+\"[a-z]+`<br>
コンテキストがあるユーザーマクロ: `{$MACRO:regex:"\.+\\"[a-z]+"}`<br>
何らかの表現の文字列内。例: `func(arg1, arg2, arg3)="{$MACRO:regex:\"\\.+\\\\\"[a-z]+\"}"`

注意:

- 文字列ではバックスラッシュによるエスケープも必要です。
- 文字列では引用符によるエスケープも必要です。
- ここでも2段階のエスケープが必要です。
  1. ユーザーマクロのコンテキストをエスケープするため、バックスラッシュエスケープは不要です。
  2. 文字列であるため、バックスラッシュエスケープは必要です。

[comment]: # ({/5cc50e18-137e19de})
