public PriorityConditions GetPriorityConditions(string query) { PriorityConditions priorityConditions = new PriorityConditions(); string regexp; try { //Проверяем есть ли условие по очереди на скиллах if ((bool)CheckRegexIsMatch(query, @"queue \w+")) { //Проверяем очередь только на одном из скиллов if ((bool)CheckRegexIsMatch(query, @"queue in \(\w+")) { priorityConditions.queueSingle = true; } //Проверяем очередь на всех скиллах списка if ((bool)CheckRegexIsMatch(query, @"queue in each \(\w+")) { priorityConditions.queueMultiple = true; } //Получаем список скиллов regexp = @"\((\w+\,{0,})+\)"; if ((bool)CheckRegexIsMatch(query, regexp)) { string skillsStr = (string)CheckRegexIsMatch(query, regexp, true); priorityConditions.skills = ParseSkills(skillsStr, ',', new char[] { '(', ')' }); } //Получаем знак сравнения для очереди regexp = @"\) <|>|<=|>=|== \d+"; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.signQueue = (string)CheckRegexIsMatch(query, regexp, true); } //Получаем значение очереди regexp = @"\) .{1,2} \d+"; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.queueVal = GetIntAfterSign(query, regexp); } regexp = @"queue.*\) (<|>|<=|>=|=) \d+ then priority = \d+"; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.priorityWhenQ = GetIntAfterSign(query, regexp); } } if ((bool)CheckRegexIsMatch(query, @"timewait > \d+")) { priorityConditions.timeWait = true; regexp = @"timewait <|>|<=|>=|== \d+"; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.signTimeWait = (string)CheckRegexIsMatch(query, regexp, true); } regexp = @"timewait .{1,2} \d+"; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.timeWaitVal = GetIntAfterSign(query, regexp); } regexp = @"timeWait.(<|>|<=|>=|=) \d+ then priority = \d+"; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.priorityWhenTimeW = GetIntAfterSign(query, regexp); } } regexp = @" and "; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.unitCondition = 1; } regexp = @" or "; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.unitCondition = -1; } } catch (Exception e) { MessageBox.Show("Не удалось распарсить запрос, описывающий приоритизацию\n" + e.Message, "Ошибка приоритизации", MessageBoxButton.OK, MessageBoxImage.Error); return(null); } return(priorityConditions); }
static void Main(string[] args) { //string query = "if queue in each (skill1,skill2,skill3,skill4) > 50 then priority = 4 and timeWait > 3 then priority = 2"; //string query = "if timeWait > 1 then priority = 1 and queue in (skill1,skill2,skill3,skill4) > 10 then priority = 3"; //string query = "if timeWait > 3 then priority = 2"; //string query = "if queue in (skill1,skill2,skill3,skill4) > 50 then priority = 4"; string query = "if queue in each (skill1,skill2) > 50 then priority = 4 or timeWait > 3 then priority = 2"; PriorityConditions priorityConditions = new PriorityConditions(); string regexp; //Проверяем есть ли условие по очереди на скиллах if ((bool)CheckRegexIsMatch(query, @"queue \w+")) { //Проверяем очередь только на одном из скиллов if ((bool)CheckRegexIsMatch(query, @"queue in \(\w+")) { priorityConditions.queueSingle = true; } //Проверяем очередь на всех скиллах списка if ((bool)CheckRegexIsMatch(query, @"queue in each \(\w+")) { priorityConditions.queueMultiple = true; } //Получаем список скиллов regexp = @"\((\w+\,{0,})+\)"; if ((bool)CheckRegexIsMatch(query, regexp)) { string skillsStr = (string)CheckRegexIsMatch(query, regexp, true); priorityConditions.skills = ParseSkills(skillsStr, ',', new char[] { '(', ')' }); } //Получаем знак сравнения для очереди regexp = @"\) <|>|<=|>=|== \d+"; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.signQueue = (string)CheckRegexIsMatch(query, regexp, true); } //Получаем значение очереди regexp = @"\) .{1,2} \d+"; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.queueVal = GetIntAfterSign(query, regexp); } regexp = @"queue.*\) (<|>|<=|>=|=) \d+ then priority = \d+"; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.priorityWhenQ = GetIntAfterSign(query, regexp); } } if ((bool)CheckRegexIsMatch(query, @"timewait > \d+")) { priorityConditions.timeWait = true; regexp = @"timewait <|>|<=|>=|== \d+"; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.signTimeWait = (string)CheckRegexIsMatch(query, regexp, true); } regexp = @"timewait .{1,2} \d+"; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.timeWaitVal = GetIntAfterSign(query, regexp); } regexp = @"timeWait.(<|>|<=|>=|=) \d+ then priority = \d+"; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.priorityWhenTimeW = GetIntAfterSign(query, regexp); } } regexp = @" and "; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.unitCondition = 1; } regexp = @" or "; if ((bool)CheckRegexIsMatch(query, regexp)) { priorityConditions.unitCondition = -1; } if (!priorityConditions.queueSingle && priorityConditions.queueMultiple && priorityConditions.timeWait && priorityConditions.signTimeWait == ">" && priorityConditions.signQueue == ">" && priorityConditions.queueVal == 50 && priorityConditions.timeWaitVal == 3 && priorityConditions.priorityWhenQ == 4 && priorityConditions.skills.Count == 2 && priorityConditions.unitCondition == -1 && priorityConditions.priorityWhenTimeW == 2 ) { Console.WriteLine("Success"); foreach (var skill in priorityConditions.skills) { Console.WriteLine(skill); } } Console.ReadLine(); }