[draft] New std.regex walkthrough
Dmitry Olshansky
dmitry.olsh at gmail.com
Tue Mar 13 13:20:24 PDT 2012
On 14.03.2012 0:05, bearophile wrote:
> Dmitry Olshansky:
>
>> It's about time to break this gloomy aura, and show that std.regex is
>> actually easy to use, that it does the thing and has some nice extras.
>
> This seems a good moment to ask people regarding this small problem, that we have already discussed a little in Bugizilla (there is a significant need to show here some Bugzilla discussions):
>
> http://d.puremagic.com/issues/show_bug.cgi?id=7260
>
Yeah, it's prime thing that I regret when thinking of current API.
> The problem is easy to show:
>
> import std.stdio: write, writeln;
> import std.regex: regex, match;
>
> void main() {
> string text = "abc312de";
>
> foreach (c; text.match("1|2|3|4"))
> write(c, " ");
> writeln();
>
> foreach (c; text.match(regex("1|2|3|4", "g")))
> write(c, " ");
> writeln();
> }
>
>
> It outputs:
>
> ["3"]
> ["3"] ["1"] ["2"]
>
> In my code I have seen that usually the "g" option (that means "repeat over the
> whole input") is what I want. So what do you think about making "g" the default?
>
I like the general idea of foreach on match to work intuitively.
Yet I'm not convinced to use extra flag as "non-global".
I'd propose to yank "g" flag entirely assuming all regex are global, but
that breaks code in a lot of subtle ways. Problems of using global flag
by default:
1. Generic stuff:
assert(equal(match(...), someOtherRange)); //normal regex silently
becomes global, quite unexpectedly
2. replace that then have to be 2 funcs - replaceFirst, replaceAll or we
are back to the problem of extra flag.
I'm thinking there is a path through opApply to allow foreach iteration
of non-global regex as if it had global flag, yet not getting full range
interface. It's hackish but so far it's as best as it gets.
> This request is not as arbitrary as it looks, if you compare to the older API. See Bug 7260 for more info.
>
--
Dmitry Olshansky
More information about the Digitalmars-d
mailing list