Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Parser строки sql where / 25 сообщений из 66, страница 1 из 3
25.11.2015, 13:50
    #39113105
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
Здравствуйте! Помогите доделать парсер

Код: 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
25.11.2015, 13:56
    #39113114
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
а так же доделать

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


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

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


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

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

Код: 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
25.11.2015, 14:32
    #39113158
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
Модератор, прости меня, на медиа меня сегодня потянуло. Если будешь банить, то не дольше суток, договорились? НО!!!
...
Рейтинг: 0 / 0
25.11.2015, 14:50
    #39113182
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
AxeleronМодератор, прости меня, на медиа меня сегодня потянуло. Если будешь банить, то не дольше суток, договорились? НО!!!
Терпеть не могу, когда начинают тролить вместо того чтобы подсказать! Нет желания подсказать, воздержись от бесполезных постов!
...
Рейтинг: 0 / 0
25.11.2015, 15:02
    #39113202
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
Nechto// На выходе хочу получить лист:
List<string, string[]>

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

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



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

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

Не переживай не потеряю! А вам не зазнаться!
...
Рейтинг: 0 / 0
25.11.2015, 15:25
    #39113244
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
NechtoТерпеть не могу, когда начинают тролить вместо того чтобы подсказать!
Пиши полноценный лексический и синтаксический анализатор SQL.
...
Рейтинг: 0 / 0
25.11.2015, 15:28
    #39113251
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
NechtoЯ понять не могу причем синтаксис условия WHERE. Если я спрашиваю про парсер стоки?
Тему топику не я придумал:
NechtoParser строки sql where
...
Рейтинг: 0 / 0
25.11.2015, 15:30
    #39113258
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
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
25.11.2015, 15:31
    #39113260
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
Antonariy второй третий POST1.
...
Рейтинг: 0 / 0
25.11.2015, 15:34
    #39113264
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
AntonariyNechtoпропущено...


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

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

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

бредятина
...
Рейтинг: 0 / 0
25.11.2015, 16:12
    #39113315
MrVoid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
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
25.11.2015, 16:17
    #39113320
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
offMrVoidПисал без студии :)
А сейчас выступит пианист Сидоров.
Без ансамбля.
Сам, $ля.
Один, $ля.

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

off too :)Я, ктому же, ещё и собаку забыл.
...
Рейтинг: 0 / 0
25.11.2015, 16:31
    #39113336
MrVoid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
Или ещё короче:
Код: 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
25.11.2015, 16:37
    #39113342
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
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
25.11.2015, 16:41
    #39113351
MrVoid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
Antonariy,

Что за бред? У меня-то универсальное решение - в независимости от количества этих POST и TEST.
Так что примерь-ка facepalm!
...
Рейтинг: 0 / 0
25.11.2015, 16:42
    #39113352
MrVoid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parser строки sql where
Antonariy, или тебя количество фигурных скобок смущает? Так я могу убрать.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Parser строки sql where / 25 сообщений из 66, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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