Consider the following example:
```D
"1a".regexSwitch!(
        `([a-z])`, (char letter) => "letter " ~ letter,
        `(\d)`, (char digit) => "digit " ~ digit)()
```
If `regexSwitch` was a range function, you would expect it to return `["digit 1", "letter a"]` because "1" was first, but that would mean that I would have to scan with all the patterns to see which one matches first in the input string, and then scan with them all to see which one matches next etc. This is a big drop in efficiency, considering the main usecase of `regexSwitch` is to parse textual fields.

Lexers can do it quite efficiently, but they compile their one automata for many patterns. This is an overkill for a textual field matcher.

Also, if `regexSwitch` was to be a range function, we couldn't have default case since no match would result in empty range. But when you parse textual fields, you want to be able to specify behavior for no match.

`regexSwich` as range function will be both a lousy lexer(you need match more to make it a good lexer) and a lousy textual field parser. I'd rather keep it a good(IMAO) textual field parser and if Phobos needs a lexer - [I understand `std.lexer` is in the review queue]( http://forum.dlang.org/thread/kvvzzqrlrucwrmayqcst@forum.dlang.org#post-iothrqccdsotajmiqdsb:40forum.dlang.org)