With the match command, you only get 3 match ids:
:match noteHi /\[\cNOTE:[^=]*\]/
:2match todoHi /\[\cTODO:[^=]*\]/
:3match what /ever/
Each time you call these commands for a particular id (1,2,3) you replace whatever was there before. So you can have 3 different ones but that's it, only 3. If you need more, use matchadd().
If by "persisted" you mean only in a current vim session (not stored with text file), then :h textprop API might be what you want.
Here is the proof of the concept:
" check if 'markline' text property exists
" define Markline highlight group to be used for ....
I think what you want is found at :help pattern and searching for line number.
/\%l /\%>l /\%<l
\%23l Matches in a specific line.
\%<23l Matches above a specific line (lower line number).
\%>23l Matches below a specific line (higher line number).
These three can be used to match specific ...