Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разбить строку на подстроки 
V
    Опции темы
Voyager
Дата 2.5.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 3
Всего: 18



Тривиальный вопрос, не работал с регулярными выражениями, поэтому нужна помощь.
Как простым способом (может через регулярные выражения проще всего) выделить из строки нужные мне элементы? Делаю простой парсер, поэтому из строки например такого вида
Код

select * from :table where :expr1:expr2, :expr3: :expr4; sdfd:expr5?

мне нужно выделить только
:table 
:expr1
:expr2
:expr3
:expr4
:expr5
то есть, символ ":"+ следующее за ним слово (признак его окончания - пробел или спец. символы). Так как после выражения :expr могут стоять любые спец. символы (*?:%,;^  и т.д.), чтобы не перебирать все эти символы ( для того чтобы определить окончание выражения), нужно выделить только нужные мне слова. Как это сделать самым простым и быстрым способом?
Спасибо.

Это сообщение отредактировал(а) Voyager - 2.5.2007, 18:42
PM   Вверх
Stepan_Lameroff
Дата 2.5.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 16.12.2006

Репутация: 9
Всего: 14



Распарсить запрос можно так:
Код

            Regex rx =
                new Regex(                    @"(?im)^\s*SELECT(?:\s+TOP\s+(?<top>\d+))?\s+(?<select>.+?)\s+FROM\s+(?<from>(?:'[^']*'|\([^)]*\)|.)+?)(?:\s+WHERE\s+(?<where>(?:'[^']*'|\([^)]*\)|.)+?))?(?:\s+ORDER\s+BY\s+(?<order>.+))?\s*$",
                    RegexOptions.Compiled | RegexOptions.IgnoreCase);

            string selectQuery =
                @"SELECT TOP 100 * FROM :table WHERE :expr1:expr2, :expr3: :expr4; sdfd:expr5? ORDER BY ID";

            MatchCollection matches = rx.Matches(selectQuery);

            foreach (Match match in matches)
            {
                Console.WriteLine(match.Groups["top"].Value);
                Console.WriteLine(match.Groups["select"].Value);
                Console.WriteLine(match.Groups["from"].Value);
                Console.WriteLine(match.Groups["where"].Value);
                Console.WriteLine(match.Groups["order"].Value);
            }


На выходе поимеем:

100
*
:table
:expr1:expr2, :expr3: :expr4; sdfd:expr5?
ID

Осталось распарсить группу "where", однако, по каким критериям мне не совсем понятно  (вернее совсем непонятно smile ).
Но, я думаю, что это для Вас будет просто  smile 
PM MAIL   Вверх
Voyager
Дата 3.5.2007, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 3
Всего: 18



Спасибо, проблема решена (немного по-другому, но тоже через рег. выр.).
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0397 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.