bool IsMatch(string input, string pattern)
{
if (string.IsNullOrWhiteSpace(input) || string.IsNullOrWhiteSpace(pattern)) return false;
var constants = pattern.split(new char[] { '*', '/' });
int start = -1;
var index = constants.Select( x => { int s = pattern.IndexOf(x, start + 1); start = s; return s;} ).ToList();
int prev = 0;
string wildcards = string.empty;
for (int i = 0; i < index.Length; i++)
{
// start must be the specified literal
start = input.IndexOf(constants[i]);
if (start == -1) return false;
// skip only as specified by wildcards
if (wildcards.Length > 0 )
{
int c = wildCards.Count(x => x == '?') ;
int last = start;
while (start != -1)
{
if (start - prev - 1 < c) continue;
else break;
start = input.IndexOf(constant[i], start + 1);
}
if (start == -1 || start - prev - 1 < c) return false;
}
if (start == -1) start = last;
int wildcardsStart = index[i] + constants[i].Length;
wildcardsLen = (i+1<index.Length) ? index[i + 1] - wildcardsStart-1 : 0;
wildcards = pattern.SubString(wildcardsStart, wildCardsLen);
Debug.Assert (wildcards.Length > 0 || wildCards.ForEach(x => x == '?' || x = '*'));
}
return true;
}
string input can be "ABCDBDXYZ"
string pattern can be "A*B?D*Z"
{
if (string.IsNullOrWhiteSpace(input) || string.IsNullOrWhiteSpace(pattern)) return false;
var constants = pattern.split(new char[] { '*', '/' });
int start = -1;
var index = constants.Select( x => { int s = pattern.IndexOf(x, start + 1); start = s; return s;} ).ToList();
int prev = 0;
string wildcards = string.empty;
for (int i = 0; i < index.Length; i++)
{
// start must be the specified literal
start = input.IndexOf(constants[i]);
if (start == -1) return false;
// skip only as specified by wildcards
if (wildcards.Length > 0 )
{
int c = wildCards.Count(x => x == '?') ;
int last = start;
while (start != -1)
{
if (start - prev - 1 < c) continue;
else break;
start = input.IndexOf(constant[i], start + 1);
}
if (start == -1 || start - prev - 1 < c) return false;
}
if (start == -1) start = last;
int wildcardsStart = index[i] + constants[i].Length;
wildcardsLen = (i+1<index.Length) ? index[i + 1] - wildcardsStart-1 : 0;
wildcards = pattern.SubString(wildcardsStart, wildCardsLen);
Debug.Assert (wildcards.Length > 0 || wildCards.ForEach(x => x == '?' || x = '*'));
}
return true;
}
string input can be "ABCDBDXYZ"
string pattern can be "A*B?D*Z"
No comments:
Post a Comment