using System;
public class Test
{
public static void Main()
{
Console.WriteLine("Name.jpg: {0}", CompareWildcard("ran.jpg","*.jpg"));
}
static bool CompareWildcard(string input, string mask)
{
CharEnumerator ie = input.GetEnumerator();
CharEnumerator me = mask.GetEnumerator();
return CompareWildcardInternal(ie, me);
}
static bool CompareWildcardInternal(CharEnumerator ie, CharEnumerator me)
{
CharEnumerator inputTryAhead;
CharEnumerator maskTryAhead;
while (me.MoveNext())
{
switch (me.Current)
{
case '?':
if (!ie.MoveNext())
{
return false;
}
break;
case '*': // non greedy match, first try * matches nothing
do
{
inputTryAhead = (CharEnumerator)(ie.Clone());
maskTryAhead = (CharEnumerator)(me.Clone());
if (CompareWildcardInternal(inputTryAhead,maskTryAhead))
{
return true;
}
} while (ie.MoveNext());
return false;
case '\\':
me.MoveNext();
goto default;
default:
if (!ie.MoveNext() || ie.Current != me.Current)
return false;
break;
}
}
return !ie.MoveNext();
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCUNvbnNvbGUuV3JpdGVMaW5lKCJOYW1lLmpwZzogezB9IiwgQ29tcGFyZVdpbGRjYXJkKCJyYW4uanBnIiwiKi5qcGciKSk7Cgl9CgkKCQoKc3RhdGljIGJvb2wgQ29tcGFyZVdpbGRjYXJkKHN0cmluZyBpbnB1dCwgc3RyaW5nIG1hc2spCnsKICAgIENoYXJFbnVtZXJhdG9yIGllID0gaW5wdXQuR2V0RW51bWVyYXRvcigpOwogICAgQ2hhckVudW1lcmF0b3IgbWUgPSBtYXNrLkdldEVudW1lcmF0b3IoKTsKICAgIHJldHVybiBDb21wYXJlV2lsZGNhcmRJbnRlcm5hbChpZSwgbWUpOwp9CgoKc3RhdGljIGJvb2wgQ29tcGFyZVdpbGRjYXJkSW50ZXJuYWwoQ2hhckVudW1lcmF0b3IgaWUsIENoYXJFbnVtZXJhdG9yIG1lKQp7CiAgICBDaGFyRW51bWVyYXRvciBpbnB1dFRyeUFoZWFkOwogICAgQ2hhckVudW1lcmF0b3IgbWFza1RyeUFoZWFkOwogICAgd2hpbGUgKG1lLk1vdmVOZXh0KCkpCiAgICB7CiAgICAgICAgc3dpdGNoIChtZS5DdXJyZW50KQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgICAgICAgICBpZiAoIWllLk1vdmVOZXh0KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJyonOiAvLyBub24gZ3JlZWR5IG1hdGNoLCBmaXJzdCB0cnkgKiBtYXRjaGVzIG5vdGhpbmcKICAgICAgICAgICAgICAgIGRvCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXRUcnlBaGVhZCA9IChDaGFyRW51bWVyYXRvcikoaWUuQ2xvbmUoKSk7CiAgICAgICAgICAgICAgICAgICAgbWFza1RyeUFoZWFkID0gKENoYXJFbnVtZXJhdG9yKShtZS5DbG9uZSgpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQ29tcGFyZVdpbGRjYXJkSW50ZXJuYWwoaW5wdXRUcnlBaGVhZCxtYXNrVHJ5QWhlYWQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSB3aGlsZSAoaWUuTW92ZU5leHQoKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGNhc2UgJ1xcJzoKICAgICAgICAgICAgICAgIG1lLk1vdmVOZXh0KCk7CiAgICAgICAgICAgICAgICBnb3RvIGRlZmF1bHQ7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBpZiAoIWllLk1vdmVOZXh0KCkgfHwgaWUuQ3VycmVudCAhPSBtZS5DdXJyZW50KQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gIWllLk1vdmVOZXh0KCk7IAp9CgoKfQ==