Я стараюсь быть кратким и лаконичным. Я должен написать программу, которая принимает запросы в форме SQL и ищет XML. Прямо сейчас я пытаюсь разобрать строку на логические части, чтобы я мог работать с ними. У меня есть строка в качестве ввода и я хочу получить MatchCollection в качестве вывода.
Обратите внимание, что приведенная ниже тестовая строка имеет специальный формат, который я навязываю пользователю, чтобы все было просто. Разрешен только один оператор на строку, а вложенные запросы исключены-
string testString = "выбрать яблоки \ n из dblp \ r, где мы съели \ n группу по всем из них \ r НЕ ИМЕЯ СТРАДА \ n";
Я использую Regex со следующим шаблоном:
Regex reg = new Regex(@"(?<select> \A\bselect\b .)" +
@"(?<from> ^\bfrom\b .)" +
@"(?<where> ^\bwhere\b .)" +
@"(?<groupBy> ^\bgroup by\b .)" +
@"(?<having> ^\bhaving\b .)"
, RegexOptions.IgnoreCase | RegexOptions.Multiline
);
Насколько я знаю, это должно дать мне совпадения для каждой группы с тестовой строкой. Я бы искал точное совпадение слова «select» в начале каждой строки, за которым следовали бы любые символы, кроме символов новой строки.
Теперь я создаю коллекцию:
MatchCollection matches = reg.Matches(testString);
Чтобы убедиться, что это сработало, я использовал foreach и напечатал спички, такие как:
foreach(Match match in matches)
{
Console.WriteLine("Select: {0}", match.Groups["select"]);
//and so on
}
Проблема в том, что коллекция всегда пуста. Где-то в Regex должен быть какой-то недостаток, но я слишком неопытен, чтобы его найти. Не могли бы вы помочь мне? Большое спасибо!
Я пытался использовать. * Вместо просто. пока мне не сказали это. будет даже mathc несколько символов. Я не сомневаюсь, что это может быть проблемой, но даже при ее замене я не получаю результата.
Я не понимаю, почему так сложно сопоставить строку, начинающуюся с определенного слова, с добавлением любых символов до тех пор, пока регулярное выражение не найдет новую строку. Сдается мне, что это должно быть относительно легкой задачей.