Technically, that's not necessary.
You know that these things only change on save, so at that point you look at the difference between the old aliases and the new and update the master set. Computationally, it's only a smidgen more expensive than our current approach. And given that we're such a read-heavy environment, unnoticeably so.
Not using regular expressions, you can't. Regexps are good for telling if a string matches a pattern, they aren't good for producing a list of all strings that match a pattern (which could be infinitely long if you allow arbitrary patterns). A much simplified version of regexps could be used, but I'm not sure if it's worth it.