Do you need to capture the taxt after that optional <br> if it's there? If not, the simplest solution is just to ignore that one <rb> entirely, and just look for the <br><small> part:
<b>(.+?)</b>.*?<td valign=top>(.+?)<br><small>.*?<td valign=top><nobr>(.+?)</nobr>
Even if you want to know the details of whether the <br> is there or not - you can
test group 2 afterwards, in a separate regex. You don't have to do everything in one expression - it can be to confusing.
Here's another alternative - I inserted whitespace and comments for clarity; compile with Pattern.COMMENTS so these will be ignored.
I think this will lead to a lot of backtracking which may impact performance. Better may be the following, using negative lookahead:
[ August 05, 2003: Message edited by: Jim Yingst ]