Для вашего первого примера нет совпадения с группой 2. Таким образом, вызов Str.matched_group 2
вызывает Not_found
.
Чтобы получить более точные результаты, чем в вашей функции check
, вам необходимо обработать каждая группа отдельно со своим блоком try
. В принципе, любой вызов Str.matched_group
может вызвать Not_found
(в зависимости от свойств регулярного выражения и совпадающей строки).
Я переписал вашу функцию check
следующим образом:
let check s =
let check1 n g =
try
let m = Str.matched_group g s in
Printf.printf "'%s' group %d => n = %d, match = '%s'\n"
s g n m
with Not_found ->
Printf.printf "'%s' group %d => not matched\n" s g
in
let n = Str.search_forward re s 0 in
check1 n 1;
check1 n 2
Вот результат исправленного кода:
'{foo}' group 1 => n = 0, match = 'foo'
'{foo}' group 2 => not matched
'{foobar}' group 1 => n = 0, match = 'foo'
'{foobar}' group 2 => n = 0, match = 'bar'