Это потому, что Рута разделил документ на маленькие фрагменты / токены / основные аннотации (см. 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)};