Причиной этого является возможность совпадения нулевой ширины только с шаблонами границ слов (т. Е. \b(?=[MDCLXVI])\b
совпадений перед любым словом, начинающимся с буквы латинского числа).
Вы необходимо уточнить границы слов, сопоставить первый из них только перед словом char, а последний - только после слова char:
(?<!\w)(?:(?=[MDCLXVI])M{0,3}(?:C[MD]|D?C{0,3})(?:X[CL]|L?X{0,3})(?:I[XV]|V?I{0,3})|\d+)(?!\w)
См. демонстрационную версию regex .
Здесь (?<!\w)
действует как граница слова, которая не соответствует, если непосредственно в слева от текущего местоположения есть слово char, а (?!\w)
действует как слово граница, которая не соответствует совпадению, если непосредственно к справа от текущего местоположения есть слово char.