В общий случай вы хотите парсер ; однако, если есть гарантия, что исходная строка не имеет комментариев , строк и других сложных синтаксических конструкций, например,
// here we should split on first 2 "AND"s
Text Filed = /* And is commented*/ "A \"AND B" /* String */ AND Ticket Status != Deleted
Вы можете попробовать расщепить с помощью справка по регулярным выражениям :
using System.Text.RegularExpressions;
...
string source = "Text Field = Assignee AND Ticket Status != Deleted";
// split on =, !=, and, or
// Trim() each item if you want to get rid of leading / trailing spaces
string[] items = Regex.Split(
source,
@"(!=|\band\b|=|\bor\b)",
RegexOptions.IgnoreCase);
Для обработки (очень) простых SQL (без комментариев, строк и c.) мы можем добавить некоторые Linq (до Skip
начальная часть запроса и Take
только where
часть):
using System.Linq;
using System.Text.RegularExpressions;
...
string source =
@"SELECT # Tickets
WHERE Ticket Status <> Open OR Ticket Status > Pending
GROUP BY x
ORDER BY y";
string[] delimiters = new string[] {
"where",
"order",
"group",
//TODO: put all delimiters here
">", "<", "<>", "=", "!=", ">=", "<=",
"and", "or", "not"
};
string pattern = string.Join("|", delimiters
.OrderByDescending(item => item.Length)
.Select(item => item.All(c => char.IsLetter(c))
? $@"\b{item}\b"
: Regex.Escape(item)));
string[] items = Regex
.Split(source, $"({pattern})", RegexOptions.IgnoreCase)
.Select(item => item.Trim())
.SkipWhile(item => !"where".Equals(item, StringComparison.OrdinalIgnoreCase))
.Skip(1)
.TakeWhile(item => !"order".Equals(item, StringComparison.OrdinalIgnoreCase) &&
!"group".Equals(item, StringComparison.OrdinalIgnoreCase))
.ToArray();