std.string and std.algorithm: what to do?

Denis Koroskin 2korden at gmail.com
Sat May 16 07:15:36 PDT 2009


On Sat, 16 May 2009 14:31:04 +0400, Michel Fortin <michel.fortin at michelf.com> wrote:

> On 2009-05-14 11:06:44 -0400, Andrei Alexandrescu  
> <SeeWebsiteForEmail at erdani.org> said:
>
>> auto before = str[0 .. find(str, something)];
>
> Hum, wouldn't this be more intuitive:
>
> 	auto before = str.before(str.find(something));
>
> That could work by having "find" return a range over the searched  
> string. At first glance having find(str, "def") returning "def" sounds  
> silly and unhelpful, but since the returned "def" is a range over the  
> original, you can do a lot of interesting things with it, such as:
>
> 	auto str = "abcdefghi";
> 	auto strSlice = str.find("def"); // strSlice == "def"
> 	auto strBefore = str.before(slice); // strBefore == "abc"
> 	auto strAfter = str.after(slice); // strAfter == "ghi"
>
> An interesting thing is that it makes a lot of sense with a regex  
> argument in find:
>
> 	auto str = "abcdefghi";
> 	auto strSlice = str.find(regex("c.*g")); // strSlice = "cdefg"
> 	auto strBefore = str.before(strSlice); // strBefore = "ab"
> 	auto strAfter = str.after(strSlice); // strAfter = "hi"
>
> And you can modify the result in place:
>
> 	auto str = "hello world";
> 	str.find("world")[] = "range";
> 	assert(str == "hello range");
>
> ... although that's somewhat limited since slice[] = x can't change the  
> number of characters in the slice.
>
> The "not found" result would be the end of the string: str[$..$].
>
> Getting the position of the found string would be done like this:
>
> 	auto str = "abcdefhij";
> 	auto pos = str.before(str.find("def)).length; // pos == 3
>
> But I guess having "findPos" or "indexOf" for that would be more  
> readable.
>
>

Interesting idea! I like it.




More information about the Digitalmars-d mailing list