add like operator
This commit is contained in:
96
Pilz/Text/LikeOperator.cs
Normal file
96
Pilz/Text/LikeOperator.cs
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
namespace Pilz.Text;
|
||||||
|
|
||||||
|
public static class LikeOperator
|
||||||
|
{
|
||||||
|
public static bool IsLike(this string? input, string pattern)
|
||||||
|
{
|
||||||
|
return IsLike(input, pattern, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsLike(this string? input, string pattern, bool ignoreCase)
|
||||||
|
{
|
||||||
|
return IsLike(input, pattern, GetDefaultOptions(ignoreCase));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsLike(this string? input, string pattern, RegexOptions options)
|
||||||
|
{
|
||||||
|
var resultPattern = new System.Text.StringBuilder();
|
||||||
|
var insideList = false;
|
||||||
|
var prevInsideList = false;
|
||||||
|
|
||||||
|
for (var i = 0; i < pattern.Length; i++)
|
||||||
|
{
|
||||||
|
var c = pattern[i];
|
||||||
|
var tempInsideList = insideList;
|
||||||
|
|
||||||
|
// Manage pattern start
|
||||||
|
if (i == 0 && c != '*')
|
||||||
|
resultPattern.Append('^');
|
||||||
|
|
||||||
|
// Manage characterlists
|
||||||
|
if (c == '[' && !insideList)
|
||||||
|
{
|
||||||
|
insideList = true;
|
||||||
|
resultPattern.Append(c);
|
||||||
|
}
|
||||||
|
else if (c == ']' && insideList)
|
||||||
|
{
|
||||||
|
insideList = false;
|
||||||
|
resultPattern.Append(c);
|
||||||
|
}
|
||||||
|
else if (c == '!' && insideList && !prevInsideList)
|
||||||
|
{
|
||||||
|
// Special chars for Like that need to be converted
|
||||||
|
resultPattern.Append('^');
|
||||||
|
}
|
||||||
|
else if (c == '?' && !insideList)
|
||||||
|
{
|
||||||
|
resultPattern.Append('.');
|
||||||
|
}
|
||||||
|
else if (c == '#' && !insideList)
|
||||||
|
{
|
||||||
|
resultPattern.Append(@"\d");
|
||||||
|
}
|
||||||
|
else if (c == '*' && i == 0)
|
||||||
|
{
|
||||||
|
// Nothing to append
|
||||||
|
}
|
||||||
|
else if (c == '*' && i == pattern.Length - 1)
|
||||||
|
{
|
||||||
|
// Nothing to append
|
||||||
|
}
|
||||||
|
else if (c == '*' && !insideList)
|
||||||
|
{
|
||||||
|
resultPattern.Append(".*");
|
||||||
|
}
|
||||||
|
else if (c == '.' || c == '\\' || c == '(' || c == ')')
|
||||||
|
{
|
||||||
|
// Special chars for Regex that need to be escaped
|
||||||
|
resultPattern.Append('\\');
|
||||||
|
resultPattern.Append(c);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
resultPattern.Append(c);
|
||||||
|
|
||||||
|
// Manage pattern end
|
||||||
|
if (i == pattern.Length - 1 && c != '*')
|
||||||
|
resultPattern.Append('$');
|
||||||
|
|
||||||
|
prevInsideList = tempInsideList;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Regex.IsMatch(input, resultPattern.ToString(), options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RegexOptions GetDefaultOptions(bool ignoreCase)
|
||||||
|
{
|
||||||
|
var options = RegexOptions.Singleline | RegexOptions.CultureInvariant;
|
||||||
|
|
||||||
|
if (ignoreCase)
|
||||||
|
options |= RegexOptions.IgnoreCase;
|
||||||
|
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user