1.基本的正则表达式编译器
这是将表达式编译到Hyperscan数据库中的函数调用,该数据库可以传递给运行时函数(例如hs_scan(),hs_open_stream()等)。
hs_error_t hs_compile(const char * expression, unsigned int flags, unsigned int mode, const hs_platform_info_t * platform, hs_database_t ** db, hs_compile_error_t ** error);
说明:
- 返回值
- 成功编译后返回HS_SUCCESS; HS_COMPILER_ERROR失败,详细信息在error参数中提供。
- 参数
- expression:要解析的以NULL结尾的表达式。注意,该字符串只能表示要匹配的模式,没有定界符或标志。任何全局标志都应使用flags参数指定。例如,应通过提供abc?def作为表达式,并提供HS_FLAG_CASELESS作为标志来编译表达式/ abc?def / i。
- flags:修改表达式行为的标志。可以通过对它们进行“或”运算来使用多个标志。有效值为:
- HS_FLAG_CASELESS:匹配将不区分大小写
- HS_FLAG_DOTALL:匹配一个.不会排除换行符
- HS_FLAG_MULTILINE:^和$匹配数据中的任何换行符。
- HS_FLAG_SINGLEMATCH:每个流的表达式将只生成一个匹配项。
- HS_FLAG_ALLOWEMPTY:允许可以与空字符串匹配的表达式,例如.*。
- HS_FLAG_UTF8:将此模式视为UTF-8字符序列。
- HS_FLAG_UCP:对字符类使用Unicode属性。
- HS_FLAG_PREFILTER:在预过滤模式下编译模式。
- HS_FLAG_SOM_LEFTMOST:报告找到匹配项时报告最左端的匹配偏移量。
- HS_FLAG_COMBINATION:以逻辑组合语法解析表达式。
- HS_FLAG_QUIET:忽略此表达式的匹配报告。用于逻辑组合中的子表达式。
- mode:影响整个数据库的编译器模式标志。必须提供HS_MODE_STREAM或HS_MODE_BLOCK或HS_MODE_VECTORED之一,以便在流式,块式或矢量数据库的生成之间进行选择。另外,可以提供其他标志(以HS_MODE_开头)以启用特定功能。有关更多详细信息,请参见编译模式标志。
- platform:如果不为NULL,则使用平台结构来确定数据库的目标平台。如果为NULL,则生成一个适合在当前主机平台上运行的数据库。
- db:成功时,将在此参数中返回指向生成的数据库的指针,否则将返回NULL。调用程序负责使用hs_free_database()函数取消分配缓冲区。
- error:如果编译失败,则将返回指向hs_compile_error_t的指针,并提供错误条件的详细信息。调用者负责使用hs_free_compile_error()函数取消分配缓冲区。
- 多正则表达式编译器
这是将一组表达式编译到数据库中的函数调用,该表达式可以传递给运行时函数(例如hs_scan(),hs_open_stream()等)。每个表达式都可以用唯一的整数标记,该整数将被传递 插入match回调中以识别已匹配的模式。
hs_error_t hs_compile_multi(const char *const * expressions, const unsigned int * flags, const unsigned int * ids, unsigned int elements, unsigned int mode, const hs_platform_info_t * platform, hs_database_t ** db, hs_compile_error_t ** error);
说明:
- 返回值
- 成功编译后返回HS_SUCCESS; HS_COMPILER_ERROR失败,详细信息在error参数中提供。
- 参数
- expressions:要编译的以NULL结尾的表达式数组。请注意(与hs_compile()一样),这些字符串必须仅包含要匹配的模式,没有定界符或标志。例如,应通过提供abc?def作为表达式数组中的第一个字符串,并提供HS_FLAG_CASELESS作为flags数组中的第一个值来编译表达式/ abc?def / i。
- flags:标志数组,用于修改每个表达式的行为。可以通过对它们进行“或”运算来使用多个标志。指定NULL指针代替数组会将所有模式的标志值设置为零。有效值见上面。
- ids:一个整数数组,指定要与expressions数组中的相应模式相关联的ID号。指定NULL指针代替数组会将所有模式的ID值设置为零。
- elements:输入数组中元素的数量。
- mode:见上
- platform:见上
- db:见上
- error:见上
- 具有扩展参数支持的多个正则表达式编译器
该函数调用以与hs_compile_multi()相同的方式将一组表达式编译到数据库中,但是允许通过每个表达式的hs_expr_ext_t结构指定其他参数。
hs_error_t hs_compile_ext_multi(const char *const * expressions, const unsigned int * flags, const unsigned int * ids, const hs_expr_ext_t *const * ext, unsigned int elements, unsigned int mode, const hs_platform_info_t * platform, hs_database_t ** db, hs_compile_error_t ** error)
说明:
- 返回值
- 见上
- 参数
- ext:指向填充的hs_expr_ext_t结构的指针数组,这些结构定义每个模式的扩展行为。如果单个模式不需要扩展行为,则可以指定NULL;如果任何表达式都不需要,则可以指定整个数组。这些结构使用的内存必须由调用方分配和释放。
- 其他参数与hs_compile_multi
- 分配一个“临时”空间供Hyperscan使用
这对于运行时使用是必需的,并且每个线程或并发调用者需要一个暂存空间。此函数将使用hs_set_scratch_allocator()或hs_set_allocator()设置的任何分配器回调。
hs_error_t hs_alloc_scratch(const hs_database_t * db, hs_scratch_t ** scratch);
说明:
- 返回值
- HS_SUCCESS成功分配; HS_NOMEM,如果分配失败。如果指定了无效的参数,则可能会返回其他错误。
- 参数
- db:由hs_compile()生成的数据库
- scratch:首次分配时,应提供一个指向NULL的指针,以便可以分配新的暂存器。如果先前已分配了暂存块,则应将指向该暂存块的指针传递回来,以查看该暂存块对该数据库块是否有效。如果需要新的暂存块,则将释放原始暂存块并返回新的暂存块,否则将返回先前的暂存块。成功后,除了原始暂存空间适合的任何数据库外,暂存块还将适合与所提供的数据库一起使用。
- 打开并初始化流
hs_error_t hs_open_stream(const hs_database_t * db, unsigned int flags, hs_stream_t ** stream);
说明:
- 返回值
- HS_SUCCESS成功,其他值失败。
- 参数
- db:编译的模式数据库。
- flags:修改流行为的标志。提供此参数供将来使用,目前不使用。
- stream:成功后,将返回指向生成的hs_stream_t的指针;失败时为NULL。
- 将要扫描的数据写入打开的流
这是函数调用,其中,实际模式匹配是在将数据写入流时发生的。匹配将通过提供的match_event_handler回调返回。
hs_error_t hs_scan_stream(hs_stream_t * id, const char * data, unsigned int length, unsigned int flags, hs_scratch_t * scratch, match_event_handler onEvent, void * ctxt);
说明:
- 返回值
- 成功返回HS_SUCCESS; HS_SCAN_TERMINATED,如果匹配回调指示扫描应停止;其他值错误。
- 参数:
- id:数据将写入的流ID(由hs_open_stream()返回)。
- data:指向要扫描的数据的指针。
- length:要扫描的字节数。
- flags:修改流行为的标志。提供此参数供将来使用,目前不使用。
- scratch:hs_alloc_scratch()分配的每线程暂存空间。
- onEvent:指向匹配事件回调函数的指针。如果给出NULL指针,则不会返回任何匹配。
- ctxt:用户定义的指针,在发生匹配时将传递给回调函数。