$ emacs -Q -batch -eval '(progn (string-match "^\\(a\\)?\\(b\\)\\(c\\)?$" "b") (print (match-data)))'
(0 1 nil nil 0 1)
Note that neither the `a` nor the `c` group matched, but there are
entries for `a` in `match-data`, but not for `c`. This makes working
with the match data unnecessarily hard because its length depends on
whether certain optional groups have matched or not. I haven't seen any
discussion about this behavior in either the manual or the docstring. I
think the match data in this case should be (0 1 nil nil 0 1 nil nil).
It turns out that this is harder than I expected, because the information about the number of groups in the pattern isn't stored anywhere, and search_regs.num_regs may be different from the group count. If it turns out too hard to fix, the behavior should at least be documented.