2022 Zabbix中国峰会
2022 Zabbix中国峰会
Table of Contents

18 转义示例

概述

本页提供了在各种上下文中使用正则表达式时正确使用转义的示例。

使用触发器表达式构造函数时,会自动添加正则表达式中的正确转义。

示例

用户宏上下文

正则表达式: \.+\"[a-z]+
用户宏上下文: {$MACRO:regex:"\.+\\"[a-z]+"}

注意:

  • 反斜杠不需要转义
  • 引号需要转义。

LLD 宏函数

正则表达式: \.+\"[a-z]+
LLD 宏: {{#MACRO}.iregsub("\.+\\"[a-z]+", \1)}

注意:

  • 反斜杠不进行转义;
  • 引号进行转义。

LLD 宏函数在用户宏上下文

正则表达式: \.+\"[a-z]+
LLD 宏: {{#MACRO}.iregsub("\.+\\"[a-z]+", \1)}
用户宏上下文: {$MACRO:"{{#MACRO}.iregsub(\".+\\\"[a-z]+\", \1)}"}

注意:

  • LLD 的反斜杠转义不发生变化;
  • 在将 LLD 宏插入用户宏上下文时,我们需要将其放入字符串中:
  1. 在宏表达式周围添加引号;
  2. 引号需要转义;总共引入了 3 个新的反斜杠。

字符串参数的非历史函数

字符串内容: \.+\"[a-z]+
表达式: concat("abc", "\\.\\\"[a-z]+")

注意:

  • 字符串参数需要对反斜杠和引号进行转义。

字符串参数的历史函数

字符串内容: \.+\"[a-z]+
表达式: find(__ITEM_KEY__,,"regexp","\.+\\"[a-z]+")

注意:

  • 反斜杠不需要转义;
  • 引号需要转义。

LLD 宏函数在非历史函数的字符串参数中

正则表达式: \.+\"[a-z]+
LLD 宏: {{#MACRO}.iregsub("\.+\\"[a-z]+", \1)}
表达式: concat("abc, "{{#MACRO}.iregsub(\"\\.+\\\\\"[a-z]+\", \\1)}")

注意:

  • 字符串参数需要对反斜杠和引号进行转义;
  • 由于宏仅在字符串去引用后才解析,因此需要增加额外的转义层。

LLD 宏函数在历史函数的字符串参数中

正则表达式: \.+\"[a-z]+
LLD 宏: {{#MACRO}.iregsub("\.+\\"[a-z]+", \1)}
表达式: find(__ITEM_KEY__,,"eq","{{#MACRO}.iregsub(\"\.+\\\"[a-z]+\", \1)}")

注意:

  • 反斜杠不需要转义;
  • 引号需要转义。

用户宏上下文在非历史函数的字符串参数中

正则表达式: \.+\"[a-z]+
用户宏上下文: {$MACRO:regex:"\.+\\"[a-z]+"}
表达式: concat("abc, "{$MACRO:regex:\"\\.+\\\\\"[a-z]+\"}")

注意:

  • 与前一个示例相同,需要额外的转义层;
  • 反斜杠和引号仅在最顶层进行转义(因为它是字符串参数)。

用户宏上下文在历史函数的字符串参数中

正则表达式: \.+\"[a-z]+
用户宏上下文: {$MACRO:regex:"\.+\\"[a-z]+"}
表达式: find(__ITEM_KEY__,,"eq","{$MACRO:regex:\"\.+\\\"[a-z]+\"}")

注意:

  • 反斜杠不需要转义;
  • 引号需要转义。

LLD 宏函数在用户宏上下文内部非历史函数中

正则表达式: \.+\"[a-z]+
LLD 宏: {{#MACRO}.iregsub("\.+\\"[a-z]+", \1)}
用户宏上下文: {$MACRO:"{{#MACRO}.iregsub(\".+\\\"[a-z]+\", \1)}"}
表达式: concat("abc, "{$MACRO:\"{{#MACRO}.iregsub(\\\".+\\\\\\\"[a-z]+\\\", \\1)}\"}")

请注意三层转义:

  1. 对于LLD宏函数,不转义反斜杠;
  2. 对于带上下文的用户宏,不转义反斜杠;
  3. 对于函数的字符串参数,转义反斜杠。

LLD 宏函数在用户宏上下文内部历史函数中

正则表达式: \.+\"[a-z]+
LLD 宏: {{#MACRO}.iregsub("\.+\\"[a-z]+", \1)}
用户宏上下文: {$MACRO:"{{#MACRO}.iregsub(\".+\\\"[a-z]+\", \1)}"}
表达式: find(__ITEM_KEY__,,"eq","{$MACRO:\"{{#MACRO}.iregsub(\\".+\\\\"[a-z]+\\", \1)}\"}")

注意:

  • 反斜杠不需要转义;
  • 引号需要转义。

用户宏上下文仅在字符串内

正则表达式: \.+\"[a-z]+
用户宏上下文: {$MACRO:regex:"\.+\\"[a-z]+"}
在某些表达式的字符串内部,例如: func(arg1, arg2, arg3)="{$MACRO:regex:\"\\.+\\\\\"[a-z]+\"}"

注意:

  • 字符串也需要转义反斜杠;
  • 字符串也需要转义引号;
  • 再次是一个需要两层转义的情况:
  1. 用户宏上下文的转义,不转义反斜杠;
  2. 作为字符串的转义,需要转义反斜杠。