digitalmars.D.learn - New feature for std.string suggestion: locate()
- AEon (46/46) Mar 30 2005 Parsing game log files I noted that the below function was missing in
 - Regan Heath (5/10) Mar 30 2005 You could use a slice, i.e.
 - AEon (4/18) Mar 30 2005 That very much reminds me of the evil pointer arithmetic one used to see...
 
Parsing game log files I noted that the below function was missing in 
std.string.
Imagine a string with several occurrences of a char, e.g. ':'. Now to 
get the first offset you could use find(str,":"), but what about any 
other occurrences? A new find command:
	int find(char[] s, char[] sub, int count)
could let you e.g. search for the second occurrence, via
	int pos = find(str, ":", 2 )
that would also have the advantage, that you can search for one or 
*many* characters.
For the special case of searching for just 1 char I did this:
int[] l=locate("moo:blah:oink:foo", ':');
	           ^    ^    ^
	        0123456789012345678
	                  111111111
	-> returns l[0] = 3, l[1] = 8, l[2] = 13 -> l.length=3
And this is the code I used:
<code>
//---Locate the array positions of one char search---
//
//	Char:		Character you want to locate.
//
//	return:		Array of offsets that were found.
//			If not found [0] = -1
//
int[] locate( char[] string, char Char )
{
	int[] pos;
	pos.length == 0;	 // Init size		
	
	foreach(int i, char Ch; string)
	{
		if( Ch == Char )
			pos ~= i; // Collect "hits"
	}
	// ***Possibly return array of length 0 as invalid check?
	if( pos.length == 0 )
		pos ~= -1;	 // Nothing found, first element -1
	return pos;
}
</code>
Maybe it would be nice to have this in std.string?
A more powerful version:
	int[] locate( char[] string, char[] sub )
might then be even better.
AEon
 Mar 30 2005
On Thu, 31 Mar 2005 04:09:35 +0200, AEon <aeon2001 lycos.de> wrote:Parsing game log files I noted that the below function was missing in std.string. Imagine a string with several occurrences of a char, e.g. ':'. Now to get the first offset you could use find(str,":"), but what about any other occurrences?You could use a slice, i.e. i = find(str,':'); j = i + 1 + find(str[i+1..$],':'); Regan
 Mar 30 2005
Regan Heath wrote:On Thu, 31 Mar 2005 04:09:35 +0200, AEon <aeon2001 lycos.de> wrote:That very much reminds me of the evil pointer arithmetic one used to see everywhere in C :) AEonParsing game log files I noted that the below function was missing in std.string. Imagine a string with several occurrences of a char, e.g. ':'. Now to get the first offset you could use find(str,":"), but what about any other occurrences?You could use a slice, i.e. i = find(str,':'); j = i + 1 + find(str[i+1..$],':');
 Mar 30 2005








 
 
 
 AEon <aeon2001 lycos.de>