std.regexp vs std.regex [Re: RegExp.find() now crippled]

Lutger Blijdestijn lutger.blijdestijn at gmail.com
Mon Nov 15 14:04:40 PST 2010


Steve Teale wrote:

> KennyTM~ Wrote:
> 
>> On Nov 15, 10 14:58, Steve Teale wrote:
>> > Some time ago in phobos2, the following:
>> >
>> >     RegExp wsr = RegExp("(\\s+)");
>> >     int p = wsr.find("<thingie att1=\"whatever\">");
>> >     writefln("%s|%s|%s %d",wsr.pre(),  wsr.match(1), wsr.post(), p);
>> >
>> > would print:
>> >
>> > <thingie| |att1="whatever">  7
>> >
>> > Now it prints
>> >
>> > <thingie| |att1="whatever">  1
>> >
>> > The new return value is pretty useless, equivalent to returning a bool.
>> > It seems to me that the 'find' verb's subject should be the string, not
>> > the RegExp object.
>> >
>> > This looks like a case of the implementation being changed to match the
>> > documentation, when in fact it would have been better to change the
>> > documentation to match the implementation.
>> >
>> > Either that, or RegExp should have an indexOf method that behaves like
>> > string.indexOf.
>> >
>> > Steve
>> >
>> 
>> Isn't std.regexp replaced by std.regex? Why are both of them still in
>> Phobos 2?
>> 
>> (oh, and std.regex is missing a documented .index (= .src_start)
>> property.)
> 
> I guess std.regexp is still there because not all of us necessarily want
> to iterate a range to simply find out the position of the first whitespace
> in a string. Part of the expressiveness of languages is that one should be
> free to use the style that suits, and not have to read the documentation
> every time one uses it. Give me options in Phobos by all means.
> 
> D2 is not going to succeed by forcing its users to use unfamiliar, and
> maybe not yet very fashionable constructions.
> 
> I'm pissed off because this change broke a lot of my code, which I had not
> used for some time, but now have a paying customer for. The code did not
> break because of D language evolution. It broke because somebody decided
> they did not like the style of std.regexp.  All I wanted was plain old
> regular expressions, similar to JavaScript, or PHP, or other popular
> languages, and std.regexp did that pretty well at one time.
> 
> Steve

I'm pretty sure that can be filed as a bug. The behavior is still documented 
as returning index of match, and the standalone std.regexp.find works that 
way. Patch:

@@ -1045,7 +1045,7 @@
     {
         int i = test(string);
         if (i)
-            i = pmatch[0].rm_so != 0;
+            i = pmatch[0].rm_so;
         else
             i = -1;         // no match
         return i;




More information about the Digitalmars-d mailing list