Finding string with "wild" characters in another string

P

Pawe³

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
 
J

John Harrison

Pawe³ said:
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
 
R

Roman Ziak

Pawe³ said:
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++;
}
}
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top