I am. Should be pretty straightforward to add, though, if needed. Maybe I don't completely understand, but I don't know why they're useful.
I just haven't found a use case for them. All of the UI's I've ever made have unique controls, for example, "/control1" and "/control2". I've never had more than a one-to-one correspondence between OSC controls from a UI and their effects. Each control has exactly one action. If I used the pattern "/control[12]" (and there's no "\d" or something, as in regexes), then that would send them to some function that would need to pull out the number, so now I have a function that splits into two actions anyway. And in addition, I'd have to pull out the address and parse the numbers out of it---meaning this parsing has been done several times already. Also, patterns are matched when the messages are received, so not only do I have to have static OSC messages hanging around, I still need to cycle through each one to find the match. If I'm doing all this anyway, why not just match one at a time and call something or set a state or whatever?
Also, because I'd have to pull out the address to parse it to see which number is there, I'd have to use yet another, different buffer with the CNMAT OSC library just to get the address. This is one of the reasons I have the getAddress() function which returns a const pointer directly to the internal memory.
Maybe I'm missing something...