我是UIMA RUTA的新手。 我正在尝试执行一项基本任务,该任务应与特定大小的字母数字字符匹配。 例如: 123Abcd
我尝试了以下代码:
DECLARE VarA;
ANY{REGEXP("([A-Za-z0-9]{7})")->MARK(VarA)};
它没有按预期工作。 请让我知道我在做什么错。 相同的REGEX在RUTA以外的其他REGEX引擎中均可使用。
谢谢。
答案 0 :(得分:2)
这是因为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个任何令牌(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)};