powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Парсинг математического выражения
25 сообщений из 33, страница 1 из 2
Парсинг математического выражения
    #38750290
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К примеру есть такая входная строка:
z - min(z123, 456) + (k2) / sqrt(x) * (SomeFunc("Sunshine 34",f_var) + 45 - t)

Суть в том, чтобы вытащить переменные (z, z123, k2, x, f_var, t) и заменить их какими-то числами.
А суть вопроса, как вытащить-то ? Какую логическую базу подвести ?
Если вдруг что, C# .NET 4.0
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750412
рубист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tual,

Ищи статьи по лексическому разбору программ и выражений.

https://ru.wikipedia.org/wiki/Лексический_анализ
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750435
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualА суть вопроса, как вытащить-то ? Какую логическую базу подвести ?
Если вдруг что, C# .NET 4.0
Регулярки там есть?
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750484
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть - примерно так...

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<!DOCTYPE html>
<html>
<head>
<!--
<script src='http://code.jquery.com/jquery-latest.js'></script>
<link rel='stylesheet type=text/css href=tmp.css' />
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
var str='z - min(z123, 456) + (k2) / sqrt(x) * (SomeFunc("Sunshine 34",f_var) + 45 - t)';
var a=str.replace(/"[^"]*"/g,'').match(/[A-Za-z]([A-Za-z\d_]+)?(?=([\s\-\,\)\+\*\/]))/g);
for (var i=0; i<a.length; i++) {
	var re=new RegExp(a[i]+'(?=([\\s\\-\\,\\)\\+\\*\\/]))','g');
	str=str.replace(re,'{'+i+'}');
};
alert(str);
</script>
</head>
<body>
</body>
</html>
</html>
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750504
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам помогут регулярные выражения. RegExp в простонародье.
Регулярные выражения в .NET Framework
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750516
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eldarkaaВам помогут регулярные выражения. RegExp в простонародье.
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750541
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krysa, у вас тут сущий винегрет в коде :)
можете проще подсказать регулярку на переменную... а есче интересно, как вы избежали текста внутри кавычек... там тоже может быть текст похожий на переменную
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750547
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750554
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualkrysa, у вас тут сущий винегрет в коде :)
Пример полностью рабочий! Т.ч. не гони волну...

tualможете проще подсказать регулярку на переменную...
Это как понять?
Метод match() как раз их все и покажет...

tualа есче интересно, как вы избежали текста внутри кавычек... там тоже может быть текст похожий на переменную
Для этого я убрал текст "в кавычках" методом replace()...
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750579
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualвытащить переменные (z, z123, k2, x, f_var, t) и заменить их какими-то числами.а какими числами?
есть карта (имя_переменной, значение)?
если есть, то все просто.
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750615
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да это грубо говоря часть некоего задания... неважно откуда строка взялась, неважно что с ней будет потом.
Надо просто найти переменные, и потом заменить их произвольными числами.
Ну разве что если переменная X встретилась не один раз, то заменить одним и тем же числом.
Вся беда в регулярках, в которых я слаб :)
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750633
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualВся беда в регулярках, в которых я слаб :)
Регулярки они и в Африке регулярки... Просто возьми мой пример и все дела.
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750651
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Взял :) Надо ж еще понять, что в нем и как :) Вот почитал доку и понял где что и почему в нем. Даже добавил оператор % и учел переменные начинающиеся с _ :)
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750658
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualДаже добавил оператор % и учел переменные начинающиеся с _ :)а случай, когда строка оканчивается на переменную, учел?
(если к твоему примеру в конец добавить "+ z")
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750663
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а кстати нет
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750673
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как его учесть, куда $ засунуть ?
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750688
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualА как его учесть, куда $ засунуть ?после [\s\-\,\)\+\*\/] и [\\s\\-\\,\\)\\+\\*\\/] добавь |$

хотя все равно есть баг и вопрос.

баг - если в строку "Sunshine 34" поместить z, например, так "Sunshine z 34", то он заменится.

вопрос - возможны ли в строках экранирования кавычек, например, \" (а так же экранирования экранирований \\). Если да, то есть ещё один баг :)
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750700
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про экранированные кавычки ничего не сказано.
Про текст внутри кавычек - это типа строковая константа, то есть в ней априори нет переменных, просто какая-то константа.

Я в js regexp не секу
просветите об этом месте
Код: javascript
1.
2.
3.
4.
for (var i=0; i<a.length; i++) {
	var re=new RegExp(a[i]+'(?=([\\s\\-\\,\\)\\+\\*\\/]))','g');
	str=str.replace(re,'{'+i+'}');
};


по смыслу тут понятно, что найденные места заменяются текстом {i}, но мне надо это перевести на c#
но какими методами не понимаю, ибо на js не понял :)
тем более что замена идет уже на строке оригинала, там где был стерт текст с кавычками, то есть явно без ориентации на индекс в строке
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750707
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualПро текст внутри кавычек - это типа строковая константа, то есть в ней априори нет переменных, просто какая-то константа.вот и я про то.
"Sunshine z 34" должно остаться как есть, а сейчас заменяется на " "Sunshine {0} 34""
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750712
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лучше с другим моим вопросом подскажите...
А то если не пойму просто способа, мне придется в лоб собирать строку по индексам и оффсетам.

PS Насчет текста в кавычках, его видимо тоже придется так собирать.
PPS Матч на переменные я делаю при отброшенном тексте с кавычками (replace), так что то не проблема.
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750772
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualМатч на переменные я делаю при отброшенном тексте с кавычками (replace), так что то не проблема.это понятно.
только вот последующую замену переменных на значение ты делаешь на исходной строке, и если в ней нашлась переменная z не внутри кавычек, то заменится она так же и внутри.


вот, набросал функцию
Код: 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.
string ReplaceVars(string str)
{
    bool insideQuotes = false;
    Dictionary<string, string> dict = new Dictionary<string, string>();
    Random r = new Random();
    Regex rx = new Regex(@"""|[A-Za-z_][0-9A-Za-z_]*(?!\s*\()(?=([^0-9A-Za-z_]|$))");
    return rx.Replace(str, (MatchEvaluator)delegate(Match m)
    {
        if (m.Value == "\"") {
            insideQuotes = !insideQuotes;
            return m.Value;
        }
        if (insideQuotes)
        {
            return m.Value;
        }
        string v;
        if (!dict.TryGetValue(m.Value, out v))
        {
            v = r.Next().ToString();
            dict[m.Value] = v;
        }
        return v;
    });
}

//-------
string str = "z - min(z123, 456) + (k2) / sqrt(x) * (SomeFunc(\"Sunshine z 34\",f_var) + 45 - t) + z";
string result = ReplaceVars(str);



заменяет переменные на рандомщину.
Одинаковые переменные - одинаковые значения.
учтено все кроме экранирования кавычек.
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750787
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот это может экранирования кавычек обработать )

Код: 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.
string ReplaceVars(string str)
{
    bool insideQuotes = false;
    Dictionary<string, string> dict = new Dictionary<string, string>();
    Random r = new Random();
    Regex rx = new Regex(@"\\*""|[A-Za-z_][0-9A-Za-z_]*(?!\s*\()(?=([^0-9A-Za-z_]|$))");

    return rx.Replace(str, (MatchEvaluator)delegate(Match m)
    {
        if (m.Value[m.Value.Length-1] == '"') {
            insideQuotes = (m.Value.Length % 2 == 1) ? !insideQuotes : insideQuotes;
            return m.Value;
        }
        if (insideQuotes)
        {
            return m.Value;
        }
        string v;
        if (!dict.TryGetValue(m.Value, out v))
        {
            v = r.Next().ToString();
            dict[m.Value] = v;
        }
        return v;
    });
}


...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750826
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если хотите что бы этот код потом можно было поддерживать лучше генератором воспользоваться аналогичным LEX
например
если разберётесь, это окупится...
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38751147
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный Мечбаг - если в строку "Sunshine 34" поместить z, например, так "Sunshine z 34", то он заменится.
Понятное дело, что с кавычками придется дорабатывать... Прятать их сначала, потом работать с переменными. По окончанию замен "возвращать" строковые константы.
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38752112
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)лучше генератором воспользоваться аналогичным LEX
а просто конечный автомат - никак не реализовать?
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Парсинг математического выражения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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