Регулярное выражение для сопоставления нескольких строк с положительным взглядом позади - PullRequest
2 голосов
/ 25 мая 2011

Итак, я пытался объединить ответы на эти два вопроса:
C # разбивает строку, но сохраняет разделенные символы \ разделители
регулярное выражение для сопоставления нескольких строк

По сути, я хотел бы иметь возможность разбивать строку вокруг определенных строк и иметь строки разделения в выходном массиве Regex.Split(). Вот что я пробовал до сих пор:

// ** I'd also like to have UNION ALL but not sure how to add that
private const string CompoundSelectRegEx = @"(?<=[\b(UNION|INTERSECT|EXCEPT)\b])";
string sql = "SELECT TOP 5 * FROM Persons UNION SELECT TOP 5 * FROM Persons INTERSECT SELECT TOP 5 * FROM Persons EXCEPT SELECT TOP 5 * FROM Persons";

string[] strings = Regex.Split(sql, CompoundSelectRegEx);

Проблема в том, что он начинает сопоставлять отдельные символы, такие как E и U, поэтому я получаю неверный массив строк.

Я также хотел бы сопоставить вокруг UNION ALL, но поскольку это не просто слово, а строка, я не был уверен, как добавить его к приведенному выше регулярному выражению, так что если кто-то также может указать мне правильное направление, было бы здорово!

Спасибо!

1 Ответ

2 голосов
/ 25 мая 2011

Если вы хотите разделить эти слова и включить их в результаты, просто замените их и поместите в группу.Там нет необходимости для осмотра.Этот шаблон должен соответствовать вашим потребностям:

string pattern = @"\b(UNION(?:\sALL)?|INTERSECT|EXCEPT)\b";

(?:\sALL)? делает слово ALL необязательным.Часть (?:...) означает совпадение, но не захватывает указанный шаблон.Трейлинг ? в конце группы делает его необязательным.Если вы хотите обрезать результаты, вы можете добавить \s* в конце шаблона.

Имейте в виду, что это может работать для простых операторов SQL, но как только вы начнете работать с вложенными запросами, вышеуказанный подходнаверное сломается.На этом этапе регулярное выражение может быть не лучшим решением, и вам следует вместо этого разработать парсер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...