powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Parser строки sql where
66 сообщений из 66, показаны все 3 страниц
Parser строки sql where
    #39113105
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Помогите доделать парсер

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
const string str = @"(TEST1 = 111 OR TEST1 = 222) AND (POST1 = 555)";

var rx = new Regex(@"\((.*?)\)");
var smt = rx.Matches(str)
                  .OfType<Capture>()
                  .Select(s => s.Value.Replace("(", "").Replace(")", "").Split(new[] {"OR", "="}, StringSplitOptions.None))
                  .SelectMany(s => s.Select(sm => sm.Trim()).ToArray())
                  .ToList();



// На выходе хочу получить лист:
List<string, string[]>

TEST1, { 111, 222 }
POST1, { 555 }
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113114
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а так же доделать

Код: sql
1.
where xxx in (select yyy from zzz inner join aaa ...)


нет, тут что-то в консерватории менять надо.
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113121
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariyа так же доделать

Код: sql
1.
where xxx in (select yyy from zzz inner join aaa ...)


нет, тут что-то в консерватории менять надо.

Нет в консерватории все так как надо!
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113150
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как то так, не совсем красиво но работает. Если у кого есть какие более короче варианты, прошу выложить.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
const string str = @"(TEST1 = 111 OR TEST1 = 222) AND (POST1 = 555)";

var rx = new Regex(@"\((.*?)\)");
var smt = rx.Matches(str)
     .OfType<Capture>()
     .Select(s => s.Value.Replace("(", "").Replace(")", "").Split(new[] {"OR", "="}, StringSplitOptions.None))
     .Select(s => new { key = s[0].Trim(), value = s })
     .Select(s => new { s.key, value = s.value.Where(w => !s.key.Trim().Contains(w.Trim())).Select(sm => sm.Trim()).ToArray() })
     .Select(s => new { s.key , s.value })
     .ToList();
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113158
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор, прости меня, на медиа меня сегодня потянуло. Если будешь банить, то не дольше суток, договорились? НО!!!
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113182
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AxeleronМодератор, прости меня, на медиа меня сегодня потянуло. Если будешь банить, то не дольше суток, договорились? НО!!!
Терпеть не могу, когда начинают тролить вместо того чтобы подсказать! Нет желания подсказать, воздержись от бесполезных постов!
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113202
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto// На выходе хочу получить лист:
List<string, string[]>

А если так будет?
Код: c#
1.
"(TEST1 = 111 OR (TEST1 = 222 AND POST1 = 333)) AND (POST1 = 555)"
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113208
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoAxeleronМодератор, прости меня, на медиа меня сегодня потянуло. Если будешь банить, то не дольше суток, договорились? НО!!!
Терпеть не могу, когда начинают тролить вместо того чтобы подсказать! Нет желания подсказать, воздержись от бесполезных постов!
Юноша, главное не теряйте надежды!
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113209
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TNechto// На выходе хочу получить лист:
List<string, string[]>

А если так будет?
Код: c#
1.
"(TEST1 = 111 OR (TEST1 = 222 AND POST1 = 333)) AND (POST1 = 555)"



Я понять не могу причем синтаксис условия WHERE. Если я спрашиваю про парсер стоки?
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113214
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AxeleronNechtoпропущено...

Терпеть не могу, когда начинают тролить вместо того чтобы подсказать! Нет желания подсказать, воздержись от бесполезных постов!
Юноша, главное не теряйте надежды!

Не переживай не потеряю! А вам не зазнаться!
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113244
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoТерпеть не могу, когда начинают тролить вместо того чтобы подсказать!
Пиши полноценный лексический и синтаксический анализатор SQL.
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113251
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoЯ понять не могу причем синтаксис условия WHERE. Если я спрашиваю про парсер стоки?
Тему топику не я придумал:
NechtoParser строки sql where
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113258
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoDima Tпропущено...

А если так будет?
Код: c#
1.
"(TEST1 = 111 OR (TEST1 = 222 AND POST1 = 333)) AND (POST1 = 555)"



Я понять не могу причем синтаксис условия WHERE. Если я спрашиваю про парсер стоки?Может быть потому что в условиях написано "Parser строки sql where "?

Если строка именно такая и никакая больше, то занафига все эти кренделя с linq?
Просто вытаскиваем =\s*(\d+), первые два матча это TEST1, второй POST1.
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113260
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy второй третий POST1.
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113264
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonariyNechtoпропущено...


Я понять не могу причем синтаксис условия WHERE. Если я спрашиваю про парсер стоки?Может быть потому что в условиях написано "Parser строки sql where "?

Если строка именно такая и никакая больше, то занафига все эти кренделя с linq?
Просто вытаскиваем =\s*(\d+), первые два матча это TEST1, второй POST1.

Да строка where должна иметь только такую структуру. А как же значения?
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113278
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(\d+) это и есть значения. при условии, что это целые положительные числа.
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113283
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
var rePost = new Regex("POST\d+\s*?=\s*?\d+");
var reTest = new Regex("TEST\d+\s*?=\s*?\d+");
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113289
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrVoid
Код: c#
1.
2.
var rePost = new Regex("POST\d+\s*?=\s*?\d+");
var reTest = new Regex("TEST\d+\s*?=\s*?\d+");

бредятина
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113315
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Писал без студии :)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
class Program
{
	static void Main(string[] args)
	{

		const string str = @"(TEST1 = 111 OR TEST1 = 222) AND (POST1 = 555)";
		var rePost = new Regex(@"POST\d+\s*?=\s*?(\d+)");
		var reTest = new Regex(@"TEST\d+\s*?=\s*?(\d+)");

		int i = -1;
		var dic = new Dictionary<string, string[]>();
		var postMatches = rePost.Matches(str);
		var testMatches = reTest.Matches(str);

		string[] posts = new string[postMatches.Count];
		string[] tests = new string[testMatches.Count];

		dic.Add("POST", posts);
		dic.Add("TEST", tests);

		foreach (Match match in postMatches)
		{
			dic["POST"].SetValue(match.Groups[1].Value, ++i);
		}
		i = -1;
		foreach (Match match in testMatches)
		{
			dic["TEST"].SetValue(match.Groups[1].Value, ++i);
		}

		foreach (var key in dic.Keys)
		{
			Console.WriteLine("Key: " + key);
			foreach (var value in dic[key])
			{
				Console.WriteLine("\t" + value);
			}
		}
	}
}
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113320
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offMrVoidПисал без студии :)
А сейчас выступит пианист Сидоров.
Без ансамбля.
Сам, $ля.
Один, $ля.

Сорри, детство вспомнилось
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113323
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

off too :)Я, ктому же, ещё и собаку забыл.
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113336
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или ещё короче:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
class Program
{
	static void Main(string[] args)
	{

		const string str = @"(TEST1 = 111 OR TEST1 = 222) AND (POST1 = 555)";
		var matches = Regex.Matches(str, @"(?'name'(TEST|POST))\d+\s*?=\s*?(?'number'\d+)");
		var dic = new Dictionary<string, List<string>>();

		dic.Add("POST", new List<string>());
		dic.Add("TEST", new List<string>());

		foreach (Match match in matches)
		{
			dic[match.Groups["name"].Value].Add(match.Groups["number"].Value);
		}

		foreach (var key in dic.Keys)
		{
			Console.WriteLine("Key: " + key);
			foreach (var value in dic[key])
			{
				Console.WriteLine("\t" + value);
			}
		}
	}
}
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113342
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrVoidИли ещё короче:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
class Program
{
	static void Main(string[] args)
	{

		const string str = @"(TEST1 = 111 OR TEST1 = 222) AND (POST1 = 555)";
		var matches = Regex.Matches(str, @"(?'name'(TEST|POST))\d+\s*?=\s*?(?'number'\d+)");
		var dic = new Dictionary<string, List<string>>();

		dic.Add("POST", new List<string>());
		dic.Add("TEST", new List<string>());

		foreach (Match match in matches)
		{
			dic[match.Groups["name"].Value].Add(match.Groups["number"].Value);
		}

		foreach (var key in dic.Keys)
		{
			Console.WriteLine("Key: " + key);
			foreach (var value in dic[key])
			{
				Console.WriteLine("\t" + value);
			}
		}
	}
}

да все равно facepalm.jpg


Код: vbnet
1.
2.
3.
4.
        Dim str = "(TEST1 = 111 OR TEST1 = 222) AND (POST1 = 555)"
        Dim m = System.Text.RegularExpressions.Regex.Matches(str, "=\s*(\d+)")
        Dim mTest() As Integer = {CInt(m(0).Groups(1).Value), CInt(m(1).Groups(1).Value)}
        Dim mPost() As Integer = {CInt(m(2).Groups(1).Value)}
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113351
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Что за бред? У меня-то универсальное решение - в независимости от количества этих POST и TEST.
Так что примерь-ка facepalm!
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113352
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy, или тебя количество фигурных скобок смущает? Так я могу убрать.
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113353
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrVoidAntonariy,

Что за бред? У меня-то универсальное решение - в независимости от количества этих POST и TEST.
Так что примерь-ка facepalm!
NechtoДа строка where должна иметь только такую структуру.
Так что мимо.

Универсальное решение - это законченный лексер и парсер.
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113355
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA, "сдаёмсу!" © :-)
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113360
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
            String str = @"(TEST1 = 111 OR TEST1 = 222) AND (POST1 = 555)";
            String[] words = str.Split(new Char[] {' ', '(', ')'});
            for (Int32 i = 1; i < words.Length - 1; i++) {
                if (words[i].Equals("=")) Console.WriteLine("{0}={1}", words[i - 1], words[i + 1]);
            }
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113367
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

ТСу нужен другой вывод на экран...
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113373
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Код: c#
1.
Regex.Matches(str, @"(?'name'(TEST|POST))\d+\s*?=\s*?(?'number'\d+)").Cast<Match>().ToList().ForEach(m => Console.WriteLine(m.Groups["name"].Value + "=" + m.Groups["number"].Value));
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113381
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrVoidAntonariy, или тебя количество фигурных скобок смущает? Так я могу убрать. меня смущает твое игнорирование ТЗ: авторДа строка where должна иметь только такую структуру.
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113486
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoДа строка where должна иметь только такую структуру.
грамматика описана?
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113498
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, уговорили))) В одну строку:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
Regex.Matches(str, @"(?'name'(TEST|POST))\d+\s*?=\s*?(?'number'\d+)").
	Cast<Match>().GroupBy(m => m.Groups["name"].Value).
	ToList().
	ForEach(group =>
	{
		Console.WriteLine(group.Key);
		group.ToList().ForEach(g => Console.WriteLine("\t" + g.Groups["number"].Value));
	});
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113505
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилграмматика описана?
ага.
msdn<search_condition> ::=
{ [ NOT ] <predicate> | ( <search_condition> ) }
[ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ]
[ ,...n ]
<predicate> ::=
{ expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression
| string_expression [ NOT ] LIKE string_expression
[ ESCAPE 'escape_character' ]
| expression [ NOT ] BETWEEN expression AND expression
| expression IS [ NOT ] NULL
| CONTAINS
( { column | * } , '<contains_search_condition>' )
| FREETEXT ( { column | * } , 'freetext_string' )
| expression [ NOT ] IN ( subquery | expression [ ,...n ] )
| expression { = | < > | ! = | > | > = | ! > | < | < = | ! < }
{ ALL | SOME | ANY} ( subquery )
| EXISTS ( subquery ) }
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113567
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

КС грамматика, однако
регулярками - не разбирается
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113701
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если where для MSSQL'ного запроса, то для этого варианта парсер есть, эта тема несколько раз обсуждалась в MSSQL'ном разделе. Вот, например .
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113774
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113804
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113842
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВhVostt http://sergeyteplyakov.blogspot.ru/2010/12/dynamic-linq.html
А это тут причем?

разбор выражения из строки и превращение его в дерево.
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113927
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
разбор выражения из строки и превращение его в дерево.
Таки тама сышарп разбирается не эскуелъ!
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113930
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВТаки тама сышарп разбирается не эскуелъ!

Приведённый пример автором с самого начала треда легко разберёт. И более сложные условия тоже.
А про всякие вендорные кличевеки и конструкции речи не шло.
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113983
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Приведённый пример автором с самого начала треда легко разберёт. И более сложные условия тоже.
А про всякие вендорные кличевеки и конструкции речи не шло.
А посля надоть писать свой визитор, дабы получить чего хотелось?
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113986
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DynamicLINQ
+1
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113988
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ANTLR!
...
Рейтинг: 0 / 0
Parser строки sql where
    #39113994
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAANTLR!
Он тут нинакукуй не нужно :)
...
Рейтинг: 0 / 0
Parser строки sql where
    #39114021
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronskyANAANTLR!
Он тут нинакукуй не нужно :)Как и DynamicLINQ :)
...
Рейтинг: 0 / 0
Parser строки sql where
    #39114025
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA, так я не понял, автор топика не написал парсер? Если да, надо бы коммерциализировать.
...
Рейтинг: 0 / 0
Parser строки sql where
    #39114062
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronskyANA, так я не понял, автор топика не написал парсер? Если да, надо бы коммерциализировать.Нет, не написал.
...
Рейтинг: 0 / 0
Parser строки sql where
    #39114148
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВА посля надоть писать свой визитор, дабы получить чего хотелось?

Ну а после, имея дерево выражений, мы можем его использовать. Ну или обойти дерево и прочитать.
...
Рейтинг: 0 / 0
Parser строки sql where
    #39114153
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Parser строки sql where
    #39114342
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Код: c#
1.
2.
3.
4.
5.
            String str = @"(TEST1 = 111 OR TEST1 = 222) AND (POST1 = 555)";
            String[] words = str.Split(new Char[] {' ', '(', ')'});
            for (Int32 i = 1; i < words.Length - 1; i++) {
                if (words[i].Equals("=")) Console.WriteLine("{0}={1}", words[i - 1], words[i + 1]);
            }


Самое лучшее решение ))) Все остальное - мозголомное баловство
...
Рейтинг: 0 / 0
Parser строки sql where
    #39114412
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Самое лучшее решение ))) Все остальное - мозголомное баловство
Спасибо, КЭП!
...
Рейтинг: 0 / 0
Parser строки sql where
    #39114511
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Самое лучшее решение ))) Все остальное - мозголомное баловство
так и скажи - формальные грамматики и синтаксический разбор - не осилил
...
Рейтинг: 0 / 0
Parser строки sql where
    #39114569
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилArm79Самое лучшее решение ))) Все остальное - мозголомное баловство
так и скажи - формальные грамматики и синтаксический разбор - не осилил

Не-а, не осилил. Так и думал, что для жестко заданного формата строки нужно обязательно "формальные грамматики и синтаксический разбор"
...
Рейтинг: 0 / 0
Parser строки sql where
    #39115980
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем два варианта, которые выполняют поставленную задачу.
Строка может быть разной, эту строку я привил для примера. А так может быть все что угодно.
Код: c#
1.
'(TEST1 = 111 OR TEST1 = 222) AND (RAZ = 'Тип емкости') AND (BIZ_D = 24.7) AND (DATER = '01.01.2015')'


Dima T
Код: c#
1.
2.
3.
4.
5.
            String str = @"(TEST1 = 111 OR TEST1 = 222) AND (POST1 = 555)";
            String[] words = str.Split(new Char[] {' ', '(', ')'});
            for (Int32 i = 1; i < words.Length - 1; i++) {
                if (words[i].Equals("=")) Console.WriteLine("{0}={1}", words[i - 1], words[i + 1]);
            }

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
const string str = @"(TEST1 = 111 OR TEST1 = 222) AND (POST1 = 555)";
var rx = new Regex(@"\((.*?)\)");
var smt = rx.Matches(str)
     .OfType<Capture>()
     .Select(s => s.Value.Replace("(", "").Replace(")", "").Split(new[] {"OR", "="}, StringSplitOptions.None))
     .Select(s => new { key = s[0].Trim(), value = s })
     .Select(s => new { s.key, value = s.value.Where(w => !s.key.Trim().Contains(w.Trim())).Select(sm => sm.Trim()).ToArray() })
     .Select(s => new { s.key , s.value })
     .ToList();
...
Рейтинг: 0 / 0
Parser строки sql where
    #39115981
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Parser строки sql where
    #39116318
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще не утомились? Какие выносливые и упрямые :)
...
Рейтинг: 0 / 0
Parser строки sql where
    #39116329
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron,

не мытьём так катанием!
...
Рейтинг: 0 / 0
Parser строки sql where
    #39117996
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Axeleron,
Вам есть что предложить?
...
Рейтинг: 0 / 0
Parser строки sql where
    #39118004
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoСтрока может быть разной
Ну правильно - нахрена об этом сразу говорить? Я в самом конце скажу. :) Молодец, автор!
...
Рейтинг: 0 / 0
Parser строки sql where
    #39118055
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Так и думал, что для жестко заданного формата строки нужно обязательно "формальные грамматики и синтаксический разбор"
а что, есть описание "жёстко заданного формата"?
если нет - остаётся предположить некое подмножество ANSI SQL
...
Рейтинг: 0 / 0
Parser строки sql where
    #39118269
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoAxeleron,
Вам есть что предложить?
Мне предложить нечего, я велосипеды не пишу.
...
Рейтинг: 0 / 0
Parser строки sql where
    #39118271
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoAxeleron,
Вам есть что предложить?
Но, чтобы не захламлять, я сразу сказал по сути 18470999
...
Рейтинг: 0 / 0
Parser строки sql where
    #39118351
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилArm79Так и думал, что для жестко заданного формата строки нужно обязательно "формальные грамматики и синтаксический разбор"
а что, есть описание "жёстко заданного формата"?
если нет - остаётся предположить некое подмножество ANSI SQL

Да не, я то ориентировался на утверждение ТС, что строка фиксированного формата, а оказывается - что нет.
Так что без анализа строки не обойтись ))) А там такое замудрить можно...
...
Рейтинг: 0 / 0
Parser строки sql where
    #39118362
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Да не, я то ориентировался на утверждение ТС, что строка фиксированного формата
и ты повёлся
...
Рейтинг: 0 / 0
Parser строки sql where
    #39118400
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,

А откуда берется сам запрос, который надо парсить?
Я подозреваю - что он генерируется на основе данных формы. Причем генератор не слишком умный и замысловатые конструкции вроде exists не вставляет. Так почему бы не допилить генератор, чтобы он откладывал доп-условия в сторонку.

В целом согласен с предшествующими участниками дискуссии. оно конечно написать нисходящий разбор узкого подмножества SQL можно.... если точно знать все ограничения. Например - select из одной таблицы или из многих, в качестве условий - равенства полю константе или более сложные выражения, и т д.
...
Рейтинг: 0 / 0
66 сообщений из 66, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Parser строки sql where
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]