У меня есть логика, в которой клиент указывает строку, и мое приложение сообщает клиенту, присутствует ли эта строка в тексте, примерно так:
internal const string GlobalText = "blablabla";
bool PresentInTheText(string searchString)
{
return GlobalText.IndexOf(searchString, StringComparison.OrdinalIgnoreCase) >= 0;
}
В основном, если текст содержит переданную строку, верните true, иначе false.
Теперь я хочу сделать его более сложным. Допустим, если клиент передает строку "foo && bar"
, и мне нужно вернуть true, если этот текст содержит подстроки "foo"
и "bar"
, простой подход:
bool result;
if (!string.IsNullOrEmpty(passedExpression) &&
passedExpression.Contains(" && "))
{
var tokens = passedExpression.Split(new[] { " && " }, StringSplitOptions.RemoveEmptyEntries);
result = true;
foreach (var token in tokens)
{
if (GlobalText.IndexOf(token, StringComparison.OrdinalIgnoreCase) < 0)
{
result = false;
}
}
}
return result;
Это работает для таких выражений, как A && B && C
. Но я хочу обобщить решение для поддержки всех логических операторов. Скажем: ("foo" && "bar") || "baz"
. Каким будет решение?
Я бы сказал, возьмите переданную строку, используя регулярное выражение, добавьте ко всем строкам код .IndexOf(token, StringComparison.OrdinalIgnoreCase) < >= 0
, это будет так:
("foo".IndexOf(token, StringComparison.OrdinalIgnoreCase) < >= 0 &&
"bar".IndexOf(token, StringComparison.OrdinalIgnoreCase) < >= 0)) ||
"baz".IndexOf(token, StringComparison.OrdinalIgnoreCase) < >= 0
а затем превратить эту строку в функцию и выполнить с помощью Reflections
. Что было бы лучшим решением?
Приблизительное время прибытия:
Тестовые случаи:
bool Contains(string text, string expressionString);
string text = "Customers: David, Danny, Mike, Luke. Car: BMW"
string str0 = "Luke"
string str1 = "(Danny || Jennifer) && (BMW)"
string str2 = "(Mike && BMW) || Volvo"
string str3 = "(Mike || David) && Ford"
string str4 = "David && !BMW"
bool Contains(string text, string str0); //True - This text contains "Luke"
bool Contains(string text, string str1); //True - David and BMW in the text
bool Contains(string text, string str2); //True - Mike and BMW in the text
bool Contains(string text, string str3); //False - no Ford in the list
bool Contains(string text, string str4); //False - BMW in the list
&&
является частью самой строки - person M.kazem Akhgary   schedule 02.12.2016