I would like to match everything between start and end given the following string:
const test = `this is the start
a
b
c
e
f
end
g
h
`;
I have the following regex
const output = test.match(/start((.|\n)*)end/m);
No, output[0] contains the whole string that matched (with start and end)
output[1] is the match (everything between start and end)
output[2] is only a return (\n)
What I don't understand is where does the second match/group (output2) come from. Amy suggestions?

This part of your regular expression:
((.|\n)*)creates two capturing groups. The outer group collects all the matched "anything" characters matched by the inner*group. The inner group will contain the last matched single character.Note that you'd probably be better off with a slightly different regular expression to avoid the odd effect of collecting too many characters in the groups before backtracking takes over.