Okay, it looks like the parsing method needs to be more sophisticated than the one I described above.

If the extbans are stacked, they can contain multiple extban characters and data, all of which need to be parsed and split separately and compared case-sensitive/case-insensitive per extban:data combination.

-> irc2.unrealircd.org MODE #thisisatest +b ~q:~xyz!abc@lmn.org~c:#pumpkin~T:censor:*badword*
<- :nick!user@host MODE #thisisatest +b ~q:~xyz!abc@lmn.org~c:#pumpkin~T:censor:*badword*

Notice that the ~ prefix can also be used in data, so it is not as simple as spltting the line into parts based on the prefix character. We will need to go character by character, validating each character, and its formatting, against the EXTBAN list, and splitting them into multiple extban:extdata parts.

Really, the only way to be sure we are doing this correctly is to look at the ircd source code. The odds are that UnrealIRCd and Freenode will do this differently, which means that an IRC client cannot parse this information without using a different method for each ircd.

I am going to leave this issue for now, since I cannot see a practical solution.