模块契约Pattern

所有权

  • 编译对象通过 xrtPatternRef、xrtPatternRelease 管理。
  • Builder 通过 xrtPatternBuilderFree 释放。
  • 模式和捕获名由 Builder/编译对象复制。
  • xpatternspec.Value 不转移所有权。
  • 捕获 xstrview 只在输入文本仍然有效时有效。

完整函数列表见 Pattern API reference。

Builder 的关联元数据事务

ID 为 Builder 实例局部的槽位/代际;不同 Builder 可产生相同数字,调用方 必须同时保存实例身份。代际或版本耗尽时拒绝相应结构修改并报 StateError, 不回绕、不使旧 ID 复活。xrtPatternBuilderContains 查询活动 ID;无效或 陈旧 ID 为 false,不设置错误(NULL Builder 仍报 ArgumentError)。

当模式表与语言对象 tag 等关联元数据必须一起更新时,使用 xpatternedit:

1. xrtPatternBuilderPrepareAdd(builder, specs, count) 准备整批追加; PrepareSet(builder, id, spec)、PrepareRemove(builder, id)、 PrepareClear(builder) 准备替换、删除、清空。Set/Remove 的无效 ID 报 StateError,不采用原有非报错 false 的查找语义。 2. xrtPatternEditReady/Count/Id 查询独占编辑及确定的 ID。准备不改变活动 条目、版本、Dirty 或缓存;可能增长物理容量。失败或取消不消费 ID。 3. 调用方完成关联元数据的可能失败部分,再调用 xrtPatternEditCommit。 有效且串行的提交不分配、不失败;空 Add/Clear 不增加版本。 4. xrtPatternEditFree 释放编辑。未提交时即取消;已提交时只释放元数据。 Commit 不自动释放编辑,提交后仍可读取其 Count/Id,但不能再次提交。

Pending 期间其他结构修改(包含 Reserve)报 StateError;读取与 Compile 仍使用提交前的完整状态。Builder Free 自动使 edit 失效,但不代替调用方 EditFree。Builder/edit 须串行且不得重入修改;元数据及用户析构/回调等 外部副作用不由原生事务自动回滚。事务/代际白盒、实际 OOM 及无分配提交 回归在 tests/pattern/test_pattern_edit.c;OOM 子集仅在 MEMORY_DEBUG 开启时执行。

模式语法

  • 字面字段按字节精确匹配。
  • {name} 捕获一个非空字段,不能跨越配置中的分隔字节。
  • prefix{name}、{name}suffix 与 prefix{name}suffix 捕获同一字段中

前后缀之间的非空字节;前后缀按字节精确匹配。

  • {*name} 捕获剩余文本,只能位于模式末尾,并允许空值。
  • {{ 和 }} 在字面字段中分别表示 { 和 }。
  • 捕获名必须是 ASCII 标识符,同一模式内不能重名。
  • 一个字段至多包含一个普通捕获;{a}-{b} 当前是编译错误,尾捕获不能

与任何字面量混合。

  • 匹配始终锚定完整输入,不执行路径规范化、URL 解码或大小写折叠。

默认分隔符为 /。xpatternconfig.Separators 是分隔字节集合;模式中的 分隔符仍要求精确匹配。设置为 /. 后,/file/{name}.{ext} 可以分别捕获 文件名和扩展名,但 / 与 . 不会互相替代。

一次性提取

xrtPatternExtract 在模式、参数和捕获容量有效时不分配内存,适合偶发 匹配;错误报告本身仍可能创建 xerror。同一模式被重复使用时,应通过 xrtPatternCompile 编译一次。

批量编译与匹配

xrtPatternCompileMany 将多条模式编译成不可变对象。xrtPatternLookup 只返回获胜模式;xrtPatternMatch 还按出现顺序写入捕获视图。编译对象没有 可变 matcher 缓存,可由多个线程同时查询。

模式按第一个不同字段决定特异度:字面字段优先于混合捕获,混合捕获优先于 整字段捕获,整字段捕获优先于尾捕获。多个混合捕获同时命中时,固定字节 总数更多者优先;总数相同时,前缀更长者优先。结构无法区分且优先级相同的模式会产生 XPATTERN_ERROR_CONFLICT;不同优先级可以显式替换这种同结构模式。优先级 不会令参数模式反超可同时命中的字面模式。

动态模式

xpatternbuilder 复制并缓存模式解析结果。Add、Set、Remove 只修改 Builder;xrtPatternBuilderCompile 生成新的不可变快照。旧快照不会观察到 后续修改,因而可以由上层使用 generation 或 RCU 风格生命周期安全发布。

Builder 不保证并发安全。未修改的 Builder 再次编译会返回缓存快照的新 引用;批量追加具有事务性。

xpatternresult类型

未命中不是错误,全部匹配入口使用同一三态结果。

值语义
XPATTERN_ERROR失败
XPATTERN_NONE无
XPATTERN_MATCH命中
typedef enum xpatternresult { XPATTERN_ERROR = -1, XPATTERN_NONE = 0, XPATTERN_MATCH = 1 } xpatternresult;

xpatternerror类型

pattern 模块错误代码在 xrt.pattern 域内保持稳定。

值语义
XPATTERN_ERROR_CONFIG配置非法
XPATTERN_ERROR_PATTERN失败
XPATTERN_ERROR_LIMIT超限
XPATTERN_ERROR_CONFLICT冲突
XPATTERN_ERROR_CAPACITY捕获容量不足
typedef enum xpatternerror { XPATTERN_ERROR_CONFIG = 1601, XPATTERN_ERROR_PATTERN, XPATTERN_ERROR_LIMIT, XPATTERN_ERROR_CONFLICT, XPATTERN_ERROR_CAPACITY } xpatternerror;

xpatternconfig类型

分隔符是字节集合:模式中的分隔字节仍要求精确匹配,捕获不能吞掉 集合中的任意字节。全部模式共享一份配置,以便编译成单一确定性程序。

字段类型语义
Flagsuint32标志位
Separatorsxstrview分隔符集合
MaxPatternBytessize_tMaxPatternBytes
MaxPatternssize_tMaxPatterns
MaxCapturessize_tMaxCaptures
MaxStatessize_tMaxStates
MaxCompiledBytessize_tMaxCompiledBytes
typedef struct xpatternconfig { uint32 Flags; xstrview Separators; size_t MaxPatternBytes; size_t MaxPatterns; size_t MaxCaptures; size_t MaxStates; size_t MaxCompiledBytes; uint32 Reserved[4]; } xpatternconfig;

xpatternspec类型

Value 仅作为借用值随命中返回,XRT 不获取或释放其所有权。

字段类型语义
Patternxstrview模式串
Valueptr值
Priorityint32优先级
Flagsuint32标志位
typedef struct xpatternspec { xstrview Pattern; ptr Value; int32 Priority; uint32 Flags; } xpatternspec;

xpatternmatch类型

{name} 捕获非空字段,也可写成 prefix{name}suffix;一个字段至多一个普通 捕获,前后缀至少一侧非空。{*name} 仍独占最终字段并可捕获空尾部。 捕获由调用方数组按模式中的出现顺序保存,PatternIndex 属于当前快照。

字段类型语义
Idxpatternid标识
PatternIndexsize_tPatternIndex
Valueptr值
CaptureCountsize_tCaptureCount
typedef struct xpatternmatch { xpatternid Id; size_t PatternIndex; ptr Value; size_t CaptureCount; } xpatternmatch;

xpatternid类型

零值永远不是有效的 Builder 条目句柄。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef uint64 xpatternid;

xpattern类型

编译对象不可变、可跨线程共享并通过引用计数管理。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xpattern xpattern;

xpatternbuilder类型

Builder 可变且不保证并发安全;成功编译不会清空其中的模式。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xpatternbuilder xpatternbuilder;
一次性提取

xrtPatternConfigInit函数

初始化默认的 "/" 分隔符、严格语义和有限资源预算。

void xrtPatternConfigInit(xpatternconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收配置
返回值
返回含义失败时状态
无已初始化—
错误
  • 无 — 初始化不失败

范例已编译验证

pattern_tour · 默认配置

	xrtPatternConfigInit(&Config);

xrtPatternExtract函数

直接解析并完整匹配一条模式;模式、参数和捕获容量有效时不分配内存,捕获视图借用 Text。

xpatternresult xrtPatternExtract(xstrview Pattern, xstrview Text, xstrview* arrCapture, size_t iCapacity, size_t* pCaptureCount)

参数

参数方向约束说明
Pattern输入借用模式表达式
Text输入借用待匹配文本
arrCapture输出容量足够时非空捕获视图数组
iCapacity输入—捕获容量
pCaptureCount输出非空接收所需/实际数量
返回值
返回含义失败时状态
XPATTERN_MATCH命中一条模式—
XPATTERN_NONE没有模式匹配不设错误
XPATTERN_ERROR参数、容量或预算失败xrt.pattern 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取
  • xrt.pattern / XPATTERN_ERROR_CAPACITY(XERR_RANGE) — 捕获输出容量不足;pCaptureCount 写入所需数量,不产生部分捕获

范例已编译验证

pattern_tour · 一次性匹配

	if ( (xrtPatternExtract(SV("{user}/{host}"),
			SV("jane/example.org"), Captures, 4u,
			&iNeeded) != XPATTERN_MATCH) ||
		(iNeeded != 2u) ||
		(Captures[0].Size != 4u) ||
		(memcmp(Captures[0].Data, "jane", 4u) != 0) ||
		(Captures[1].Size != 11u) ||
		(memcmp(Captures[1].Data, "example.org", 11u) != 0) ) {

xrtPatternExtractConfig函数

使用自定义分隔符和预算执行一次性匹配。

xpatternresult xrtPatternExtractConfig(xstrview Pattern, xstrview Text, const xpatternconfig* pConfig, xstrview* arrCapture, size_t iCapacity, size_t* pCaptureCount)

参数

参数方向约束说明
Pattern输入借用模式表达式
Text输入借用待匹配文本
pConfig输入非空分隔符与预算配置
arrCapture输出容量足够时非空捕获视图数组
iCapacity输入—捕获容量
pCaptureCount输出非空接收所需/实际数量
返回值
返回含义失败时状态
XPATTERN_MATCH命中一条模式—
XPATTERN_NONE没有模式匹配不设错误
XPATTERN_ERROR参数、容量或预算失败xrt.pattern 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.pattern / XPATTERN_ERROR_CONFIG(XERR_ARGUMENT) — 配置字段非法、保留字段非零或花括号被配置为分隔符
  • xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取
  • xrt.pattern / XPATTERN_ERROR_CAPACITY(XERR_RANGE) — 捕获输出容量不足;pCaptureCount 写入所需数量,不产生部分捕获

范例已编译验证

pattern_tour · 一次性匹配(自定义配置)

	if ( xrtPatternExtractConfig(SV("{u}@{h}"),
			SV("bob@x.io"), &Config, Captures, 4u,
			&iNeeded) != XPATTERN_MATCH ) {

xrtPatternErrorOffset函数

从 xrt.pattern 错误的机器数据中读取模式内字节位置。

bool xrtPatternErrorOffset(const xerror* pError, size_t* pOffset)

参数

参数方向约束说明
pError输入非空、xrt.pattern 域编译/匹配错误
pOffset输出非空接收模式内字节偏移
返回值
返回含义失败时状态
true已写出偏移—
false错误不含位置数据不设错
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • 无位置数据时返回 false 且不设置错误

范例已编译验证

pattern_tour · 错误定位

			!xrtPatternErrorOffset(pError, &iOffset) ) {

xrtPatternErrorPattern函数

从批量编译错误的机器数据中读取失败模式索引。

bool xrtPatternErrorPattern(const xerror* pError, size_t* pPatternIndex)

参数

参数方向约束说明
pError输入非空、xrt.pattern 域批量编译错误
pPatternIndex输出非空接收失败模式索引
返回值
返回含义失败时状态
true已写出索引—
false错误不含模式索引不设错
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • 无模式索引时返回 false 且不设置错误

范例已编译验证

pattern_tour · 失败模式定位

			!xrtPatternErrorPattern(pError, &iBadIndex) ||
批量编译与匹配

xrtPatternCompile函数

使用默认配置编译一条可重复匹配的模式。

xpattern* xrtPatternCompile(xstrview Pattern)

参数

参数方向约束说明
Pattern输入借用模式表达式
返回值
返回含义失败时状态
非空不可变编译对象(引用 1)—
NULL编译失败xrt.pattern 域错误
错误
  • xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取
  • xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算
  • XERR_MEMORY — 编译或扩容分配失败

范例已编译验证

pattern_tour · 单条编译

		xpattern* pBad = xrtPatternCompile(SV("{a}{b}"));

xrtPatternCompileConfig函数

使用高级配置编译一条可重复匹配的模式。

xpattern* xrtPatternCompileConfig(xstrview Pattern, const xpatternconfig* pConfig)

参数

参数方向约束说明
Pattern输入借用模式表达式
pConfig输入非空分隔符与预算配置
返回值
返回含义失败时状态
非空不可变编译对象(引用 1)—
NULL编译失败xrt.pattern 域错误
错误
  • xrt.pattern / XPATTERN_ERROR_CONFIG(XERR_ARGUMENT) — 配置字段非法、保留字段非零或花括号被配置为分隔符
  • xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取
  • xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算
  • XERR_MEMORY — 编译或扩容分配失败

范例已编译验证

pattern_tour · 单条编译(自定义配置)

	pSingle = xrtPatternCompileConfig(SV("{user}@{host}"), &Config);

xrtPatternCompileMany函数

使用默认配置把多条模式编译成一个不可变匹配程序。

xpattern* xrtPatternCompileMany(const xpatternspec* arrSpec, size_t iCount)

参数

参数方向约束说明
arrSpec输入非空数组模式规格
iCount输入> 0模式数量
返回值
返回含义失败时状态
非空不可变编译对象(引用 1)—
NULL编译失败xrt.pattern 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取
  • xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算
  • xrt.pattern / XPATTERN_ERROR_CONFLICT(XERR_EXISTS) — 不可区分模式具有相同优先级
  • XERR_MEMORY — 编译或扩容分配失败

范例已编译验证

pattern_tour · 批量编译

		xpattern* pBadMany = xrtPatternCompileMany(BadSpecs, 2u);

xrtPatternCompileManyConfig函数

使用高级配置把多条模式编译成一个不可变匹配程序。

xpattern* xrtPatternCompileManyConfig(const xpatternspec* arrSpec, size_t iCount, const xpatternconfig* pConfig)

参数

参数方向约束说明
arrSpec输入非空数组模式规格
iCount输入> 0模式数量
pConfig输入非空分隔符与预算配置
返回值
返回含义失败时状态
非空不可变编译对象(引用 1)—
NULL编译失败xrt.pattern 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.pattern / XPATTERN_ERROR_CONFIG(XERR_ARGUMENT) — 配置字段非法、保留字段非零或花括号被配置为分隔符
  • xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取
  • xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算
  • xrt.pattern / XPATTERN_ERROR_CONFLICT(XERR_EXISTS) — 不可区分模式具有相同优先级
  • XERR_MEMORY — 编译或扩容分配失败

范例已编译验证

pattern_tour · 批量编译(自定义配置)

	pMulti = xrtPatternCompileManyConfig(Specs, 2u, &Config);

xrtPatternRef函数

增加不可变编译对象引用并返回原指针。

xpattern* xrtPatternRef(xpattern* pPattern)

参数

参数方向约束说明
pPattern输入非空目标编译对象
返回值
返回含义失败时状态
非空原指针,引用 +1—
NULL参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

pattern_tour · 共享引用

		(xrtPatternRef(pSingle) != pSingle) ||

xrtPatternRelease函数

释放不可变编译对象引用;归零时释放单块存储。

void xrtPatternRelease(xpattern* pPattern)

参数

参数方向约束说明
pPattern输入允许空空 = 空操作
返回值
返回含义失败时状态
无引用 -1—
错误
  • 无 — 释放不失败

范例已编译验证

pattern · 释放引用

	xrtPatternRelease(pPattern);

xrtPatternCount函数

返回编译对象中的模式数量。

size_t xrtPatternCount(const xpattern* pPattern)

参数

参数方向约束说明
pPattern输入非空目标编译对象
返回值
返回含义失败时状态
>= 0模式数量—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

pattern_tour · 模式数量

		(xrtPatternCount(pSingle) != 1u) ||

xrtPatternCompiledBytes函数

返回编译对象实际占用的单块存储字节数。

size_t xrtPatternCompiledBytes(const xpattern* pPattern)

参数

参数方向约束说明
pPattern输入非空目标编译对象
返回值
返回含义失败时状态
>= 0单块存储字节数—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

pattern_tour · 存储占用

		(xrtPatternCompiledBytes(pSingle) == 0u) ||

xrtPatternSeparators函数

返回编译对象复制并归一化后的分隔符集合。

xstrview xrtPatternSeparators(const xpattern* pPattern)

参数

参数方向约束说明
pPattern输入非空目标编译对象
返回值
返回含义失败时状态
视图分隔符借用(对象存活期有效)—
空视图参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

pattern_tour · 分隔符集合

		(xrtPatternSeparators(pSingle).Size != 2u) ||

xrtPatternSource函数

返回指定模式的原始表达式视图。

xstrview xrtPatternSource(const xpattern* pPattern, size_t iPattern)

参数

参数方向约束说明
pPattern输入非空目标编译对象
iPattern输入< 模式数量模式索引
返回值
返回含义失败时状态
视图表达式借用—
空视图索引越界XERR_RANGE
错误
  • XERR_RANGE — 模式索引越界;空句柄 XERR_ARGUMENT

范例已编译验证

pattern_tour · 原始表达式

		(xrtPatternSource(pSingle, 0u).Size != 13u) ||

xrtPatternId函数

返回指定模式的稳定 Builder ID;直接批量编译时 ID 也保持非零。

xpatternid xrtPatternId(const xpattern* pPattern, size_t iPattern)

参数

参数方向约束说明
pPattern输入非空目标编译对象
iPattern输入< 模式数量模式索引
返回值
返回含义失败时状态
非零稳定 ID—
0索引越界或句柄为空XERR_RANGE / XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 句柄为空
  • XERR_RANGE — 模式索引越界

范例已编译验证

pattern_tour · 稳定 ID

		(xrtPatternId(pSingle, 0u) == XPATTERN_ID_INVALID) ||

xrtPatternValue函数

返回指定模式携带的借用值。

ptr xrtPatternValue(const xpattern* pPattern, size_t iPattern)

参数

参数方向约束说明
pPattern输入非空目标编译对象
iPattern输入< 模式数量模式索引
返回值
返回含义失败时状态
值xpatternspec.Value 原样返回—
NULL未携带或索引越界XERR_RANGE
错误
  • XERR_ARGUMENT — 句柄为空
  • XERR_RANGE — 模式索引越界

范例已编译验证

pattern_tour · 携带值

		(xrtPatternValue(pMulti, 0u) != (ptr)"Jane") ||

xrtPatternCaptureCount函数

返回指定模式的捕获数量。

size_t xrtPatternCaptureCount(const xpattern* pPattern, size_t iPattern)

参数

参数方向约束说明
pPattern输入非空目标编译对象
iPattern输入< 模式数量模式索引
返回值
返回含义失败时状态
>= 0该模式捕获数量—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

pattern_tour · 捕获数量

		(xrtPatternCaptureCount(pSingle, 0u) != 2u) ||

xrtPatternMaxCaptureCount函数

返回整个编译对象中单条模式所需的最大捕获数量。

size_t xrtPatternMaxCaptureCount(const xpattern* pPattern)

参数

参数方向约束说明
pPattern输入非空目标编译对象
返回值
返回含义失败时状态
>= 0最大捕获数量—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

pattern_tour · 最大捕获数

		(xrtPatternMaxCaptureCount(pSingle) != 2u) ||

xrtPatternCaptureName函数

返回指定捕获的借用名称。

bool xrtPatternCaptureName(const xpattern* pPattern, size_t iPattern, size_t iCapture, xstrview* pName)

参数

参数方向约束说明
pPattern输入非空目标编译对象
iPattern输入< 模式数量模式索引
iCapture输入< 该模式捕获数捕获索引
pName输出非空接收名称视图
返回值
返回含义失败时状态
true已写出名称—
false无名称或索引越界不设错
错误
  • 无名称或索引越界返回 false 且不设置错误;句柄为空 XERR_ARGUMENT

范例已编译验证

pattern_tour · 捕获名称

		!xrtPatternCaptureName(pSingle, 0u, 0u, &Captures[2]) ||

xrtPatternCaptureIndex函数

按名称查找捕获索引,未找到时返回 XRT_NPOS。

size_t xrtPatternCaptureIndex(const xpattern* pPattern, size_t iPattern, xstrview Name)

参数

参数方向约束说明
pPattern输入非空目标编译对象
iPattern输入< 模式数量模式索引
Name输入借用捕获名称
返回值
返回含义失败时状态
索引命中的捕获索引—
XRT_NPOS未找到不设错
错误
  • 未找到返回 XRT_NPOS 且不设置错误;句柄为空 XERR_ARGUMENT

范例已编译验证

pattern_tour · 按名查找捕获

		(xrtPatternCaptureIndex(pSingle, 0u, SV("host")) != 1u) ) {

xrtPatternLookup函数

只选择最优模式,不记录或输出捕获。

xpatternresult xrtPatternLookup(const xpattern* pPattern, xstrview Text, xpatternmatch* pMatch)

参数

参数方向约束说明
pPattern输入非空目标编译对象
Text输入借用待匹配文本
pMatch输出允许空接收命中模式信息
返回值
返回含义失败时状态
XPATTERN_MATCH命中一条模式—
XPATTERN_NONE没有模式匹配不设错误
XPATTERN_ERROR参数、容量或预算失败xrt.pattern 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

pattern_tour · 最优选择

	if ( (xrtPatternLookup(pMulti, SV("mail/hello"),
			&Match) != XPATTERN_MATCH) ||
		(Match.PatternIndex != 1u) ||
		(Match.Value != (ptr)"Mailbox") ||
		(xrtPatternLookup(pMulti, SV("nothing"),
			&Match) != XPATTERN_NONE) ) {

xrtPatternMatch函数

选择最优模式并按出现顺序输出借用 Text 的捕获视图。

xpatternresult xrtPatternMatch(const xpattern* pPattern, xstrview Text, xstrview* arrCapture, size_t iCapacity, xpatternmatch* pMatch)

参数

参数方向约束说明
pPattern输入非空目标编译对象
Text输入借用待匹配文本
arrCapture输出容量足够时非空捕获视图数组
iCapacity输入—捕获容量
pMatch输出允许空接收命中模式信息
返回值
返回含义失败时状态
XPATTERN_MATCH命中一条模式—
XPATTERN_NONE没有模式匹配不设错误
XPATTERN_ERROR参数、容量或预算失败xrt.pattern 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.pattern / XPATTERN_ERROR_CAPACITY(XERR_RANGE) — 捕获输出容量不足;pCaptureCount 写入所需数量,不产生部分捕获

范例已编译验证

pattern · 选择并捕获

	if ( xrtPatternMatch(
		pPattern,
		XRT_STR_LITERAL("/users/admin/item-42.json"),
		arrCapture,
		2u,
		&Match
	) == XPATTERN_MATCH ) {

xrtPatternTest函数

只判断是否有模式匹配,不返回模式或捕获。

xpatternresult xrtPatternTest(const xpattern* pPattern, xstrview Text)

参数

参数方向约束说明
pPattern输入非空目标编译对象
Text输入借用待匹配文本
返回值
返回含义失败时状态
XPATTERN_MATCH命中一条模式—
XPATTERN_NONE没有模式匹配不设错误
XPATTERN_ERROR参数、容量或预算失败xrt.pattern 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

pattern_tour · 存在性判断

	if ( (xrtPatternTest(pMulti, SV("a@b")) != XPATTERN_MATCH) ||
		(xrtPatternTest(pMulti, SV("-")) != XPATTERN_NONE) ) {
动态模式

xrtPatternBuilderCreate函数

使用默认配置创建空 Builder。

xpatternbuilder* xrtPatternBuilderCreate()

参数

参数方向约束说明
无参数———
返回值
返回含义失败时状态
非空Builder—
NULL分配失败XERR_MEMORY
错误
  • XERR_MEMORY — 编译或扩容分配失败

范例已编译验证

pattern · 创建 Builder

	xpatternbuilder* pBuilder = xrtPatternBuilderCreate();

xrtPatternBuilderCreateConfig函数

使用高级配置创建空 Builder;分隔符会立即被复制。

xpatternbuilder* xrtPatternBuilderCreateConfig(const xpatternconfig* pConfig)

参数

参数方向约束说明
pConfig输入非空分隔符与预算配置
返回值
返回含义失败时状态
非空Builder—
NULL失败xrt.pattern 域错误
错误
  • xrt.pattern / XPATTERN_ERROR_CONFIG(XERR_ARGUMENT) — 配置字段非法、保留字段非零或花括号被配置为分隔符
  • XERR_MEMORY — 编译或扩容分配失败

范例已编译验证

pattern_tour · 创建 Builder(自定义配置)

	pBuilder = xrtPatternBuilderCreateConfig(&Config);

xrtPatternBuilderFree函数

释放 Builder、其中复制的模式以及内部缓存的编译快照。

void xrtPatternBuilderFree(xpatternbuilder* pBuilder)

参数

参数方向约束说明
pBuilder输入允许空空 = 空操作
返回值
返回含义失败时状态
无已释放—
错误
  • 无 — 释放不失败

范例已编译验证

pattern · 释放 Builder

		xrtPatternBuilderFree(pBuilder);

xrtPatternBuilderClear函数

清空全部条目并使已有 ID 失效,同时保留已分配槽容量。

void xrtPatternBuilderClear(xpatternbuilder* pBuilder)

参数

参数方向约束说明
pBuilder输入非空目标 Builder
返回值
返回含义失败时状态
无已清空,版本递增—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

pattern_tour · 清空条目

	xrtPatternBuilderClear(pBuilder);

xrtPatternBuilderReserve函数

保证 Builder 至少可保存指定数量的活动条目。

bool xrtPatternBuilderReserve(xpatternbuilder* pBuilder, size_t iCapacity)

参数

参数方向约束说明
pBuilder输入非空目标 Builder
iCapacity输入—期望容量
返回值
返回含义失败时状态
true容量已保证—
false扩容失败XERR_MEMORY / XERR_RANGE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY — 槽数组扩容失败
  • XERR_RANGE — 容量引起尺寸溢出

范例已编译验证

pattern_tour · 预留容量

		!xrtPatternBuilderReserve(pBuilder, 8u) ||

xrtPatternBuilderCount函数

返回 Builder 中的活动条目数量。

size_t xrtPatternBuilderCount(const xpatternbuilder* pBuilder)

参数

参数方向约束说明
pBuilder输入非空目标 Builder
返回值
返回含义失败时状态
>= 0活动条目数量—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

pattern_tour · 条目数量

		(xrtPatternBuilderCount(pBuilder) != 1u) ||

xrtPatternBuilderVersion函数

返回每次成功结构修改后递增的版本。

uint64 xrtPatternBuilderVersion(const xpatternbuilder* pBuilder)

参数

参数方向约束说明
pBuilder输入非空目标 Builder
返回值
返回含义失败时状态
版本号单调递增的结构版本—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

pattern_tour · 结构版本

	iVersion = xrtPatternBuilderVersion(pBuilder);

xrtPatternBuilderDirty函数

判断 Builder 是否存在尚未成功编译的结构修改。

bool xrtPatternBuilderDirty(const xpatternbuilder* pBuilder)

参数

参数方向约束说明
pBuilder输入非空目标 Builder
返回值
返回含义失败时状态
true是有未编译修改—
false不是有未编译修改—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

pattern_tour · 未编译修改

		!xrtPatternBuilderDirty(pBuilder) ) {

xrtPatternBuilderAdd函数

复制并追加一条模式,返回稳定代际 ID。

xpatternid xrtPatternBuilderAdd(xpatternbuilder* pBuilder, const xpatternspec* pSpec)

参数

参数方向约束说明
pBuilder输入/输出非空目标 Builder
pSpec输入非空模式规格
返回值
返回含义失败时状态
非零稳定代际 ID—
0追加失败xrt.pattern 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取
  • xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算
  • XERR_MEMORY — 编译或扩容分配失败

范例已编译验证

pattern · 追加模式

		 (xrtPatternBuilderAdd(pBuilder, &Spec) == XPATTERN_ID_INVALID) ) {

xrtPatternBuilderAddMany函数

原子追加一批模式;任意一条失败时 Builder 保持不变。

bool xrtPatternBuilderAddMany(xpatternbuilder* pBuilder, const xpatternspec* arrSpec, size_t iCount, xpatternid* arrId)

参数

参数方向约束说明
pBuilder输入/输出非空目标 Builder
arrSpec输入非空数组模式规格数组
iCount输入> 0追加数量
arrId输出允许空接收各条 ID
返回值
返回含义失败时状态
true全部追加成功—
false任一条失败,Builder 保持不变xrt.pattern 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取
  • xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算
  • XERR_MEMORY — 编译或扩容分配失败

范例已编译验证

pattern_tour · 批量追加

		if ( !xrtPatternBuilderAddMany(pBuilder, More, 2u,
				Ids) ||
			(Ids[0] == XPATTERN_ID_INVALID) ||
			(Ids[1] == XPATTERN_ID_INVALID) ||
			(xrtPatternBuilderCount(pBuilder) != 3u) ) {

xrtPatternBuilderSet函数

替换有效 ID 的模式和值,同时保留 ID 与原始注册顺序。

bool xrtPatternBuilderSet(xpatternbuilder* pBuilder, xpatternid Id, const xpatternspec* pSpec)

参数

参数方向约束说明
pBuilder输入/输出非空目标 Builder
Id输入有效 ID目标条目
pSpec输入非空新模式规格
返回值
返回含义失败时状态
true已替换,版本递增—
falseID 陈旧或规格失败xrt.pattern 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • ID 不存在或已因清空失效返回 false 且不设置错误
  • xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取
  • xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算
  • XERR_MEMORY — 编译或扩容分配失败

范例已编译验证

pattern_tour · 替换模式

	if ( !xrtPatternBuilderSet(pBuilder, IdUser, &Extra) ||
		!xrtPatternBuilderRemove(pBuilder, Ids[1]) ||
		(xrtPatternBuilderCount(pBuilder) != 2u) ||
		xrtPatternBuilderRemove(pBuilder, Ids[1]) ) {

xrtPatternBuilderRemove函数

删除有效 ID;不存在或陈旧 ID 返回 false,但不属于执行错误。

bool xrtPatternBuilderRemove(xpatternbuilder* pBuilder, xpatternid Id)

参数

参数方向约束说明
pBuilder输入/输出非空目标 Builder
Id输入有效 ID目标条目
返回值
返回含义失败时状态
true已删除,版本递增—
falseID 不存在或陈旧不设错误
错误
  • 不存在或陈旧 ID 返回 false 且不设置错误;句柄为空 XERR_ARGUMENT

范例已编译验证

pattern_tour · 删除模式

		!xrtPatternBuilderRemove(pBuilder, Ids[1]) ||

xrtPatternBuilderCompile函数

编译当前版本并返回新引用;无修改时复用缓存,失败不影响上一个快照,也不会撤销等待修正的修改。

xpattern* xrtPatternBuilderCompile(xpatternbuilder* pBuilder)

参数

参数方向约束说明
pBuilder输入非空目标 Builder
返回值
返回含义失败时状态
非空当前版本的编译快照(新引用)—
NULL编译失败xrt.pattern 域错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.pattern / XPATTERN_ERROR_PATTERN(XERR_VALUE) — 模式语法非法;字节位置可由 xrtPatternErrorOffset 读取
  • xrt.pattern / XPATTERN_ERROR_LIMIT(XERR_RANGE) — 超出捕获、状态或编译字节数预算
  • xrt.pattern / XPATTERN_ERROR_CONFLICT(XERR_EXISTS) — 不可区分模式具有相同优先级
  • XERR_MEMORY — 编译或扩容分配失败

范例已编译验证

pattern · 编译快照

	pPattern = xrtPatternBuilderCompile(pBuilder);
补充参考 · 契约见公共头注释

xrtPatternBuilderContains函数

契约注释见公共头文件。

XRT_API bool xrtPatternBuilderContains(const xpatternbuilder* pBuilder, xpatternid Id)

xrtPatternBuilderPrepareAdd函数

契约注释见公共头文件。

XRT_API xpatternedit* xrtPatternBuilderPrepareAdd(xpatternbuilder* pBuilder, const xpatternspec* arrSpec, size_t iCount)

xrtPatternBuilderPrepareSet函数

契约注释见公共头文件。

XRT_API xpatternedit* xrtPatternBuilderPrepareSet(xpatternbuilder* pBuilder, xpatternid Id, const xpatternspec* pSpec)

xrtPatternBuilderPrepareRemove函数

契约注释见公共头文件。

XRT_API xpatternedit* xrtPatternBuilderPrepareRemove(xpatternbuilder* pBuilder, xpatternid Id)

xrtPatternBuilderPrepareClear函数

契约注释见公共头文件。

XRT_API xpatternedit* xrtPatternBuilderPrepareClear(xpatternbuilder* pBuilder)

xrtPatternEditFree函数

契约注释见公共头文件。

XRT_API void xrtPatternEditFree(xpatternedit* pEdit)

xrtPatternEditReady函数

契约注释见公共头文件。

XRT_API bool xrtPatternEditReady(const xpatternedit* pEdit)

xrtPatternEditCount函数

契约注释见公共头文件。

XRT_API size_t xrtPatternEditCount(const xpatternedit* pEdit)

xrtPatternEditId函数

契约注释见公共头文件。

XRT_API xpatternid xrtPatternEditId(const xpatternedit* pEdit, size_t iIndex)

xrtPatternEditCommit函数

契约注释见公共头文件。

XRT_API bool xrtPatternEditCommit(xpatternedit* pEdit)

常量索引常量

以下常量在本页所属头文件中定义,语义见公共头注释。

常量说明
XPATTERN_CAPTURES_DEFAULT见头文件注释
XPATTERN_COMPILED_DEFAULT见头文件注释
XPATTERN_ERROR见头文件注释
XPATTERN_ERROR_CAPACITY见头文件注释
XPATTERN_ERROR_CONFIG见头文件注释
XPATTERN_ERROR_CONFLICT见头文件注释
XPATTERN_ERROR_LIMIT见头文件注释
XPATTERN_ERROR_PATTERN见头文件注释
XPATTERN_ID_INVALID见头文件注释
XPATTERN_MATCH见头文件注释
XPATTERN_NONE见头文件注释
XPATTERN_PATTERNS_DEFAULT见头文件注释
XPATTERN_PATTERN_DEFAULT见头文件注释
XPATTERN_STATES_DEFAULT见头文件注释