The reading of "a*" is to match zero or more 'a's
So
1) There are zero 'a's before the first ';' so print ITEM
2) The ';' is not an 'a' so just print ;
3) The 'a' matches 'a*' and so we print ITEM
4) After the last match, but before the second ';' there are zero 'a's
so we print ITEM
5) The ';' is not an 'a' so just print ;
6) After the last ';' but before the end of the string there are zero
'a's so print ITEM
The only oddity for me is step 4 if my understanding of how this works
is correct.
Of course without step 4 you would have what you wanted. To be honest
I am mystified by step 4, it looks like a bug to me