I have assumed brackets are matching and not overlapping. That is, every left bracket is followed by a right bracket with no left or right bracket between and every right bracket is preceded by a left bracket with no left or right bracket between.
With that proviso you can do that as follows.
str = "A;BB;C[1;22];DDD[11;2;33];EEEEE[1111]"
rgx = /;(?![^\[\]]*\])/
str.split(rgx)
#=> ["A", "BB", "C[1;22]", "DDD[11;2;33]", "EEEEE[1111]"]
Demo
The regular expression can be broken down as follows.
; # match ';'
(?! # begin negative lookahead
[^\[\]]* # match >= chars other than '[' and ']'
\] # match ']'
) # end negative lookahead
One could use the following regular expression to confirm that brackets are matching and not overlapping.
\A[^\[\]]*(?:\[[^\[\]]*\][^\[\]]*)*[^\[\]]*\z
Demo
;(?![^\[]*\])as it only checks if there is a]to the right of the current locaton after any zero or more non-[chars. It does not check if there is a[anywhere to the left.