FAST_REGEX_LOG_PARSER - Amazon Kinesis Data Analytics
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

FAST_REGEX_LOG_PARSER

FAST_REGEX_LOG_PARSE('input_string', 'fast_regex_pattern')

FAST_REGEX_LOG_PARSE 工作原理是首先将正则表达式分解为一系列正则表达式,组内的每个表达式对应一个正则表达式,组外的每个表达式对应一个正则表达式。任何表达式开始处的任何长度固定的部分都将移至上一个表达式的末尾。如果任何表达式的长度完全固定,它将与上一个表达式合并。随后,将使用无回溯的延迟语义计算一系列表达式。(在正则表达式解析用语中,“延迟”意味着每一步只会解析所需内容。“贪婪”意味着在每一步解析尽可能多的内容。)

返回的列将为 COLUMN1 到 COLUMNn,其中 n 是正则表达式中的组数。列的类型将为 varchar(1024)。 请参阅下文中“第一个 FRLP 示例”和“更多 FRLP 示例”中的示例用法。

FAST_REGEX_LOG_PARSER (FRLP)

FAST_REGEX_LOG_PARSER 使用延迟搜索 - 它将在第一个匹配项处停止。相反,除非使用物主数量词,否则 REGEX_LOG_PARSE 是大幅的。

FAST_REGEX_LOG_PARSE 将在提供的输入字符串中扫描 Fast Regex 模式指定的所有字符。 

  • 必须按 Fast Regex 模式中定义的字符和扫描组解释该输入字符串中的所有字符。扫描组定义扫描成功时生成的字段或列。

  • 如果在应用 Fast Regex 模式时解释 input_string 中的所有字符,则 FRLP 将通过 Fast Regex 模式中的每个附加说明的表达式 (按从左到右的顺序) 创建输出字段 (列)。第一个 (最左侧) 附加说明的表达式创建第一个输出字段,下一个 (第二个) 附加说明的表达式创建第二个输出字段,以此类推,最后一个附加说明的表达式创建最后一个输出字段。 

  • 如果 input_string 包含未通过应用 Fast Regex 模式解释 (匹配) 的任何字符,则 FRLP 将不会返回任何字段。

Fast Regex 的字符类符号

Fast Regex 使用正则表达式解析程序中的另一组字符类符号:

符号或构造 意义

-

字符范围,包括终端节点

[ charclasses ]

字符类

[^ charclasses ]

否定字符类

|

并集

&

交集

?

零或一个匹配项

*

零或多个匹配项

+

一个或多个匹配项

{n}

n 个匹配项

{n,}

n 或 n 个以上的匹配项

{n,m}

n 到 m 个匹配项 (包含第 n 个匹配项和第 m 个匹配项)

任意单一字符

#

空语言

@

任何字符串

"<Unicode string without double-quotes>"

字符串)

( )

空字符串)

( unionexp )

优先覆盖

< <identifier> >

指定的模式

<n-m>

数字间隔

charexp:=<Unicode character>

单个非预留字符

\ <Unicode character>

单个字符)

我们支持下列 POSIX 标准标识符作为指定的模式:

       <Digit>    -    "[0-9]"

       <Upper>    -    "[A-Z]"

       <Lower>    -    "[a-z]"

       <ASCII>    -    "[\u0000-\u007F]"

       <Alpha>    -    "<Lower>|<Upper>"

       <Alnum>    -    "<Alpha>|<Digit>"

       <Punct>    -    "[!\"#$%&'()*+,-./:;<=>?@[\\\]^_`{|}~]"

       <Blank>    -    "[ \t]"

       <Space>    -    "[ \t\n\f\r\u000B]"

       <Cntrl>    -    "[\u0000-\u001F\u007F]"

       <XDigit>    -    "0-9a-fA-F"

       <Print>    -    "<Alnum>|<Punct>"

       <Graph>    -    "<Print>"

第一个 FRLP 示例

第一个示例使用 Fast Regex 模式 '(.*)_(._.*)_.*'

select t.r."COLUMN1", t.r."COLUMN2" from . . . . . . . . . . . . .> (values (FAST_REGEX_LOG_PARSE('Mary_had_a_little_lamb', '(.*)_(._.*)_.*'))) t(r); +------------------------+-----------------------+ |         COLUMN1        |         COLUMN2       | +------------------------+-----------------------+ | Mary_had               |     a_little_lamb     | +------------------------+-----------------------+ 1 row selected
  1. input_string ('Mary_had_a_little_lamb') 的扫描从 Fast Regex 模式中定义的第一个组开始:(.*),这意味着“查找任何字符 0 次或更多次。”  

    '(.*)_(._.*)_.*'

  2. 此定义要解析的第一个列的组规范要求 Fast Regex Log Parser 接受从输入字符串的第一个字符开始的输入字符串字符,直至它查找 Fast Regex 模式中的下一个组或组外的下一个文本字符或字符串 (未在括号中)。在此示例中,第一个组后面的下一文本字符为下划线:  

    '(.*)_(._.*)_.*'

  3. 此解析程序扫描输入字符串中的每个字符,直至找到 Fast Regex 模式中的下一个规范:下划线:

    '(.*)_(._.*)_.*'

  4. 第 2 组以“a_l”开头。接下来,此解析程序需要使用模式中的剩余规范来确定此组的结束:

    '(.*)_(._.*)_.*'

注意

在模式中指定、但不在组内的字符-字符串或文本必须在输入字符串中查找,但不会包含在任何输出字段中。

如果 Fast Regex 模式省略了最后的星号,则不会获得任何结果。

更多 FRLP 示例

下一个示例使用“+”,这意味着重复最后一个表达式 1 次或多次 (“*”意味着 0 次或多次)。

示例 A

在此示例中,最长的前缀为第一个下划线。第一个字段/列组将与“Mary”匹配,第二个字段/列组将不匹配。 

select t.r."COLUMN1", t.r."COLUMN2" from . . . . . . . . . . . . .> (values (FAST_REGEX_LOG_PARSE('Mary_had_a_little_lamb', '(.*)_+(._.*)'))) t(r); +----------+----------+ | COLUMN1  | COLUMN2  | +----------+----------+ +----------+----------+ No rows selected

上一个示例未返回任何字段,因为“+”是必需的,一行中至少有一个或多个下划线;而 input_string 没有下划线。

示例 B

在以下示例中,由于延迟语义,“+”是多余的:

select t.r."COLUMN1", t.r."COLUMN2" from . . . . . . . . . . . . .> (values (FAST_REGEX_LOG_PARSE('Mary____had_a_little_lamb', '(.*)_+(.*)'))) t(r); +-------------------------+-------------------------+ |         COLUMN1         |         COLUMN2         | +-------------------------+-------------------------+ | Mary                    |    had_a_little_lamb    | +-------------------------+-------------------------+ 1 row selected

上一个示例成功返回两个字段,因为在找到“_+”规范所需的多条下划线后,组 2 规范 (.*) 接受 .input_string 中的所有剩余字符。下划线不会显示尾随“Mary”和前导“had”,因为“_+”规范未用括号括起来。

如说明中提到,“延迟”在正则表达式解析用语中的含义是每一步只会解析所需内容;“贪婪”的含义是每一步解析尽可能多的内容。

本主题中的第一个示例 A 失败,因为当它到达第一条下划线时,正则表达式处理器在没有回溯的情况下无法获知它无法使用下划线来匹配“_+”并且 FRLP 将不回溯,而 REGEX_LOG_PARSE 将回溯。 

上述示例 B 中的搜索将直接转换为三次搜索:

(.*)_ _*(._ .*)

请注意,第二个字段组将在第二次和第三次搜索之间拆分,以及“_+”视为与“__*”相同 (即,系统认为“underscore repeat-underscore-1-or-more-times”与“underscore underscore repeat-underscore-0-or-more-times”相同。)

示例 A 演示 REGEX_LOG_PARSE 和 FAST_REGEX_LOG_PARSE 之间的主要差异,因为 A 中的搜索将在 REGEX_LOG_PARSE 下进行,原因是此函数将使用回溯。

示例 C

在以下示例中,加号不是多余的,因为“<Alpha>(任何字母字符)”的长度是固定的,因此将用作“+”搜索的分隔符。

select t.r."COLUMN1", t.r."COLUMN2" from . . . . . . . . . . . . .> (values (FAST_REGEX_LOG_PARSE('Mary____had_a_little_lamb', '(.*)_+(<Alpha>.*)'))) t(r); +----------------------------+----------------------------+ |          COLUMN1           |          COLUMN2           | +----------------------------+----------------------------+ | Mary                       | had_a_little_lamb          | +----------------------------+----------------------------+ 1 row selected '(.*) +(<Alpha>.*)' gets converted into three regular expressions: '.* ' ' *<Alpha>' '.*$'

反过来将使用延迟语义匹配每个项。

返回的列将为 COLUMN1 到 COLUMNn,其中 n 是正则表达式中的组数。列的类型将为 varchar(1024)。