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

Michel Fortin michel.fortin at michelf.com
Sat May 16 03:31:04 PDT 2009


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.


-- 
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/




More information about the Digitalmars-d mailing list