【发布时间】:2019-02-12 11:54:14
【问题描述】:
我是 UIMA RUTA 的新手。 我正在尝试执行一项基本任务,该任务应匹配特定大小的字母数字字符。 例如: 123Abcd
我尝试了以下代码:
DECLARE VarA;
ANY{REGEXP("([A-Za-z0-9]{7})")->MARK(VarA)};
它没有按预期工作。 请让我知道我做错了什么。 除了 RUTA 之外,其他 REGEX 引擎中也可以使用相同的 REGEX。
提前致谢。
【问题讨论】:
我是 UIMA RUTA 的新手。 我正在尝试执行一项基本任务,该任务应匹配特定大小的字母数字字符。 例如: 123Abcd
我尝试了以下代码:
DECLARE VarA;
ANY{REGEXP("([A-Za-z0-9]{7})")->MARK(VarA)};
它没有按预期工作。 请让我知道我做错了什么。 除了 RUTA 之外,其他 REGEX 引擎中也可以使用相同的 REGEX。
提前致谢。
【问题讨论】:
这是因为 Ruta 将文档拆分为小片段/令牌/基本注释(请参阅 this)。如果单词是数字和字符的组合,则默认播种器实现会拆分单词。默认播种器实现可以由您自己的播种器更改为具有不同的行为。
您的示例“123Abcd”将被解析为以下标记(并非所有级别都在列表中 - 请参阅链接了解更多信息):
Document -> Complete document "123Abcd"
NUM -> 123
CW -> Abcd
输入“45 abcd 5”的另一个例子变成:
Document -> Complete document "45 abcd 5"
NUM -> 45
SPACE -> The spacer between 45 and abcd // Not visible by default
SW -> abcd
SPACE -> The spacer between abcd and 5 // Not visible by default
NUM -> 5
在您的示例中,您尝试将正则表达式与 Any 标记匹配。该文档包含 2 个 Any 标记(NUM 和 CW),并且因为模式不匹配(它不是 1 个标记,而是被拆分)
您可以执行以下示例以获得正确的结果:
DECLARE VarA, VarB, VarC, VarD;
// Option 1 (execute regex on the complete input document
// I think this is not a good solution because this can be slow
Document{REGEXP("([A-Za-z0-9]{7})") -> MARK(VarA)};
// Option 2 (match with regex on each annotation type)
(NUM{REGEXP("[0-9]{3}")} CW{REGEXP("[a-zA-Z]{4}")}){ -> MARK(VarB)};
// Option 3 (first match a pattern of annotations and then match the
// regex on the complete pattern)
(NUM CW){REGEXP("([A-Za-z0-9]{7})") -> MARK(VarC)};
// Option 4 (only check if its a "number + capital word")
(NUM CW){ -> MARK(VarD)};
【讨论】: