Introduction
Sometimes it is handy to have an utility that will search for a certain text pattern or execute a find and replace based on it. The string provides some limited ability to do that, but you are out of luck if you need these functions to be case insensitive and to use a wildcard algorithm.
Background
The tradeoff for this situation is that, you cannot look for ‘*’ and ‘?’ in your target text. But that’s what the string is good for, isn’t it!
I’ve included a solution with two projects. The DLL has the code that implements algorithm and the executable is merely a client that would let you enjoy the functionality in a visual way. Here is the code that's the heart for this algorithm.
protected bool _PatternMatched(int IndexText, int IndexPattern)
{
while (true)
{
char CrtTxtChar, CrtPatternChar;
CrtPatternChar=
(IndexPattern == patternlen)?'*':ConvertCase(strpattern[IndexPattern++]);
switch (CrtPatternChar )
{
case '*':
if(IndexPattern == patternlen)
{
this.last = IndexText;
return true;
}
while (IndexText < txtlen)
{
if(_PatternMatched(IndexText++,IndexPattern))
{
return true;
}
}
return false;
break;
case '?':
if(IndexText == txtlen)
return false;
IndexText++;
break;
default:
if(IndexText == txtlen)
CrtTxtChar = '\0';
else
CrtTxtChar = ConvertCase( strtxt[IndexText++] );
if( CrtTxtChar != CrtPatternChar )
{
if(CrtTxtChar=='\0')
return false;
else if(_PatternMatched(IndexText, 0))
{
if(this.first < IndexText)
this.first = IndexText;
return true;
}
else
return false;
}
else
{
if(this.last < IndexText -1)
this.last = IndexText -1;
}
break;
}
}
}
This protected method is used by the public methods IsPatternMatch
and ReplaceTextEx
that are exposed by this class. The first and last data members store the position of the pattern in the target string in order to allow the replace to work.
Using the code
Just instantiate a class of WildCardTxtUtility
and call its public functions.
Beware
A large target text and multiple wildcards in the pattern will cause performance issues. I would welcome any attempt to address them.
History
Decebal Mihailescu is a software engineer with interest in .Net, C# and C++.