Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Finding string with "wild" characters in another string

3 views
Skip to first unread message

Paweł

unread,
Jul 9, 2004, 5:36:52 AM7/9/04
to
Hello!

I'm looking for efficient code or site where I can find code for finding one
string in another string. String which I search should have "wild"
characters like '?' for any one char and '*' for any string of characters.

I'm looking for way to effective getting string from text file and then
searching it like I write above.

Thanks in advance for any helps, notices or sites

--

Best regards
Paweł Chmielarz
----------------------------------
pa...@itproject.com.pl


John Harrison

unread,
Jul 9, 2004, 5:57:38 AM7/9/04
to

"Paweł" <pa...@itproject.com.pl> wrote in message
news:cclos8$fb8$1...@sunflower.man.poznan.pl...

> Hello!
>
> I'm looking for efficient code or site where I can find code for finding
one
> string in another string. String which I search should have "wild"
> characters like '?' for any one char and '*' for any string of characters.
>
> I'm looking for way to effective getting string from text file and then
> searching it like I write above.
>
> Thanks in advance for any helps, notices or sites
>


http://www.boost.org/libs/regex/doc/index.html

john


Roman Ziak

unread,
Jul 9, 2004, 9:05:48 AM7/9/04
to
"Paweł" <pa...@itproject.com.pl> wrote in message
news:cclos8$fb8$1...@sunflower.man.poznan.pl...
> Hello!
>
> I'm looking for efficient code or site where I can find code for finding
one
> string in another string. String which I search should have "wild"
> characters like '?' for any one char and '*' for any string of characters.
>
> I'm looking for way to effective getting string from text file and then
> searching it like I write above.
>
> Thanks in advance for any helps, notices or sites

Hope this helps. I pulled it out of the project with some custom types
(e.g. char*) and changed them here to built-in types, but apologize if
it won't compile as is. The algorithm has been tested and is in production.
Unfortunately you will not get the found matched substrings as with
regular expressions, but is quite fast.

int wildMatch(char *wild, char *text)
{
enum { UNSYNC,SYNC,START };
char *lastwild, *lasttext; /* last synced position in CMP mode */
unsigned state, size; /* SEARCH mode(0), CMP mode otherwise */

for(state=START; ; )
{
if(*wild == 0) { /* is end of wildargs ? */
if(state!=UNSYNC && *text==0) /* is there text in synced mode?
*/
return 0;
if(state == START) /* there was no asterisk at all */
return -1;
/* compiler gives warning: possible use before definition */
size = wild-lastwild; /* size of the string */
return strcmp(lastwild, lasttext+strlen(lasttext)-size);
}

if(*text == 0) { /* is end of text ? */
while(*wild=='*') wild++; /* skip all asterisks */
return *wild==0 ? 0 : 1; /* wild is at the end - success */
}

if(state != UNSYNC)
{
/* sync is when texts are synchronized */
if(*wild == '*') {
while(*wild=='*') wild++;/* skip all consequent asterisks */
lastwild = wild; /* remember last positions */
lasttext = text;
state = UNSYNC; /* unsynchronize */
} else
if(*wild == *text || *wild == '?') {
wild++; /* they are same, move to nexts */
text++;
} else {
if(state == START) /* they don't match (no wildcard) */
return *wild-*text;
wild = lastwild; /* not equal chars in CMP mode */
text = ++lasttext; /* go back to last good */
state = UNSYNC; /* unsynchronize */
}
}
else
{
/* non-sync is looking first match */
if(*wild == *text) {
lasttext = text; /* remember last good position */
state = SYNC; /* synchronized again */
} else
text++;
}
}
}


0 new messages