powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Parser строки sql where
25 сообщений из 66, страница 1 из 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
25 сообщений из 66, страница 1 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Parser строки sql where
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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