without knowing the format of the input data or what flags you're using it's obviously a bit harder to reason about, but since you're doing a replace i assume you don't care about the content of the bracketed text, you just want to remove it. the way i'm reading yours is
(?: # don't store this group
# either
^ # start of line
-\[[^[]+\] # a -, a [ followed by at least one non-[, then a ] (passing one is fine)
$ # end of line
| # or
? # maybe one space
\[.+?\] # a [ followed by at least one character, then a ] (don't pass any)
? # maybe one space
)
since the two branches are almost identical, you can probably compact it into -?\s*\[.+?\]\s*. maybe a dash, then maybe some space, then angle brackets around something, then maybe more space.