Как вставить заменяемый текст в Рег. Выражение?

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Всем доброго времени суток. Подскажите, пожалуйста, есть например Json страница:
Пример кода Json:
JSON:
{"name":"'The Doctor' Romanov | Sabre","price":600,"have":468,"max":745,"rate":134,"tr":94,"res":26},
{"name":"'Two Times' McCoy | USAF TACP","price":99,"have":150,"max":150,"rate":117,"tr":0,"res":103},
{"name":"3rd Commando Company | KSK","price":291,"have":464,"max":435,"rate":123,"tr":464,"res":0},
беру все данные через GET запрос. В результате имеем в переменной весь текст с этой страницы. Теперь, мне нужно сделать Рег. Выражение, которое позволит мне, через Обработку текста (Regex) , парсить каждый раз разный определенный фрагмент этого Json файла.
Пример, что хочу получить в результате парса в новой переменной:
JSON:
Two Times' McCoy | USAF TACP","price":99,"have":150,"max":150,"rate":117,"tr":0,"res":103
Через тестер Рег. Выражений - делаю нужный Regex:
52311
Вот какое Рег. Выражение у меня выходит:
Код:
(?<=\{"name":"')Two\ Times'\ McCoy\ \|\ USAF\ TACP.*?(?=})
Но дело в том, что имя (Name) будет каждый раз разным, когда я буду обращаться к этому Json, поэтому из отдельной переменной, я буду брать нужное мне имя товара, и после, вставлять переменную в это Рег. Выражение,
Пример Рег выражения:

Код:
(?<=\{"name":"'){-Variable.Name-}.*?(?=})
но Regex использует разделение каждого слова:
До:
Код:
Two Times' McCoy | USAF TACP
После:
Код:
Two\ Times'\ McCoy\ \|\ USAF\ TACP
Как мне быть в данной ситуации, когда у меня есть имя в переменной Two Times' McCoy | USAF TACP - но Regex не дает мне использовать его на прямую из-за установки своих разделительных знаков.


Надеюсь мне удалось передать суть проблемы и что мне нужно. Заранее, очень благодарен, за попытку помочь.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
не нужно разделение каждого слова. достаточно заэкранировать управляющие символы. в данном случае это | Надо в подставляемой переменной до подставления пройтись заменой | на \| и должно работать.
52312
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Что то не так походу делаю, либо пока не работает полностью как надо:
JSON:
(?<=\{"name":"'){-Variable.LootJsonALL-}.*?(?=})
{-Variable.LootJsonALL-} = Two Times' McCoy \| USAF TACP

Так как вы сказали - находит, но если засунуть в переменную:
Код:
AK-47 \| Aquamarine Revenge (Field-Tested)
или
Код:
AK-47 \| Aquamarine Revenge \(Field-Tested\)
- находить результат перестанет.

не нужно разделение каждого слова. достаточно заэкранировать управляющие символы. в данном случае это | Надо в подставляемой переменной до подставленная пройтись заменой | на \| и должно работать.
Посмотреть вложение 52312
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
сложно сказать, так как даже в тех трех примерах у вас есть непонятки в структуре
52315

было бы проще если бы было больше данных
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
А как быть с такими именами?:
Код:
{"name":"AUG | Flame J\u00f6rmungandr (Field-Tested)","
{"name":"StatTrak\u2122 AK-47 | Aquamarine Revenge (Battle-Scarred)","
И Возможно ли через Обработка (Замена) - сразу одним блоком заменить -
| на \|
(
на \(
)
на \)


 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
а что с ними не так ? через замену экранируете ВСЕ управляющие символы и будет работать

52323
52324
 
  • Спасибо
Реакции: Gunjubasik

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
И Возможно ли через Обработка (Замена) - сразу одним блоком заменить -
| на \|
(
на \(
)
на \)
C#:
string data = project.Variables["LootJsonALL"].Value;
data=data.Replace(@"\",@"\\");
data=data.Replace(@"|",@"\|");
data=data.Replace(@"(",@"\(");
data=data.Replace(@")",@"\)");
project.Variables["LootJsonALL"].Value=data;
 
  • Спасибо
Реакции: Gunjubasik

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Вам не стыдно JSON регулярками парсить?
Вот решение с Newton.Json JToken (вот пример шаблона с подключенными библиотеками):
C#:
JToken JToken1 = JValue.Parse(project.Variables["Json3"].Value); // тут код ответа из https://loot.farm/fullprice.json
for (int i1=0; i1<JToken1.Count(); i1++) {
    JToken JToken2 = JToken1.ElementAt(i1);
    project.Variables["LootJsonALL"].Value = "'Two Times' McCoy | USAF TACP"; // эту строку лучше убрать
    if (JToken2["name"].ToString() == project.Variables["LootJsonALL"].Value) {
        //Выбираем любое свойство какое надо отдать:
        return JToken2["price"].ToString(); // вернет сразу "99"
        return JToken2.ToString(); // вернет всю строку с иерархией в форме дерева
        return JsonConvert.SerializeObject(JToken2, Newtonsoft.Json.Formatting.None);  // вернет всю строку с иерархией в форме строки
    }
}
return "искали, искали. и нифига не нашли";
a5298b5df40f71e58c72a8773e0360c5.jpg
 
Последнее редактирование:
  • Спасибо
Реакции: Gunjubasik

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Столкнулся с проблемой - сделал кубики с парсом Json и вытаскиванием из него определенный кусок. Когда запускаешь бота сначала - периодически кубик (Парсим строку с инфой к Одному Товару) перестает вытаскивать с общего Json информацию, а если запустить этот кубик вручную отдельно после ошибки - он нормально все парсит.... хотя в переменных ничего не меняется, что бы были предпосылки не рабочего бота...
Посмотрите, пожалуйста. Проблемные кубики подписаны желтыми стикерами.

C#:
string data = project.Variables["LootJsonALL"].Value;
data=data.Replace(@"\",@"\\");
Стыдно, это когда ширинка расстегнута на людях, а я учусь делать ботов на Зенно. Хотите научить(помочь) меня, делать более оптимальные и правильные боты, буду рад, если будете чаще обращать внимание на мои посты на форуме и показывать как надо. А не говорить, что мне должно быть стыдно...
Вам не стыдно JSON регулярками парсить?


P.S: Один кубик {-Variable.LootFarm_v_Centah-} в прикрепленном файле лишний - немного не доделал для демонстрации вам.
 

Вложения

Последнее редактирование:

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Столкнулся с проблемой - сделал кубики с парсом Json и вытаскиванием из него определенный кусок. Когда запускаешь бота сначала - периодически кубик (Парсим строку с инфой к Одному Товару) перестает вытаскивать с общего Json информацию, а если запустить этот кубик вручную отдельно после ошибки - он нормально все парсит.... хотя в переменных ничего не меняется, что бы были предпосылки не рабочего бота...
Посмотрите, пожалуйста. Проблемные кубики подписаны желтыми стикерами.



Стыдно, это когда ширинка расстегнута на людях, а я учусь делать ботов на Зенно. Хотите научить(помочь) меня, делать более оптимальные и правильные боты, буду рад, если будете чаще обращать внимание на мои посты на форуме и показывать как надо. А не говорить, что мне должно быть стыдно...
Ех, не приглядел кто автор темы, вспомнил... надо было пройти мимо :-). Но раз уже начал, то:
все свои кубики с попытками парсить регулярками выкидываем нафиг, ибо в будущем застрянете на экранировании\конвертации спецсимволов типа:
HTML:
{"name":"StatTrak\u2122 AK-47 | Asiimov (Factory New)","price":60858,"have":0,"max":2,"rate":115,"tr":0,"res":0}
Вот переделал шаблон (как подключить библиотеки описано в посте выше):
 

Вложения

  • Спасибо
Реакции: Gunjubasik

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Ех, не приглядел кто автор темы, вспомнил... надо было пройти мимо :-). Но раз уже начал, то:
все свои кубики с попытками парсить регулярками выкидываем нафиг, ибо в будущем застрянете на экранировании\конвертации спецсимволов типа:
HTML:
{"name":"StatTrak\u2122 AK-47 | Asiimov (Factory New)","price":60858,"have":0,"max":2,"rate":115,"tr":0,"res":0}
Вот переделал шаблон (как подключить библиотеки описано в посте выше):
Что с вашим файлом не так? Даже первый кубик GET Json выдает ошибку файла Newtonsoft.Json.dll , думал возможно по вашим ссылкам скачать можно ... Но и там ссылки на скачивания Newtonsoft.Json.dll не нашел, думал может проэкт по ссылке работать будет, и там ошибка.... Извините, но вы я так вижу не понимаете, что я не мастер вписывать dll. Можно поочередную инструкцию, пожалуйста, что куда вставить?
Нашел, скачал это Newtonsoft.Json.dll , установил куда надо, теперь первый кубик заработал, но как я понимаю, без вашей помощи, как мне верно обойти вот такие товары:
HTML:
{"name":"StatTrak\u2122 AK-47 | Asiimov (Factory New)","price":60858,"have":0,"max":2,"rate":115,"tr":0,"res":0}
Я не пойму. Хоть, пока вы отпишите, буду стараться найти ответ, методом Тыка.
Все, разобрался, теперь осталось понять, как это Newtonsoft.Json.dll работает и что это? Как теперь эту Newtonsoft.Json.dll - добавить к моему готовому проекту? Так как сейчас он не работает, если перенести кубик с парсом.
Ошибка:
Компиляция кода Ошибка в действии "CS0246" "Не удалось найти имя типа или пространства имен "JToken" (пропущена директива using или ссылка на сборку?)". [Строка: 2; Cтолбец: 5]
Можно пожалуйста скинуть урок, как оно все работает или в двух словах, объяснить как его еще используют и в каких ситуациях кроме моей?
Ура, нашел проблему, нужно было добавить ссылки из GAC + Директивы using. Если кому нужно будет - вот тут я нашел ответ.

Спасибо огромное, orka13 и Phoenix78 , за помощь. Очень помогли.

Есть ли возможность по умолчанию добавить библиотеки, что бы каждый раз не пришлось это делать?
 
Последнее редактирование:

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Так я в предыдущем посте прирепил ваш переделанный шаб - "Test Newtonsoft_Json orka13.xmlz", там ведь все GAC + Директивы using уже прикреплены. Их можно с проекта в проект скопировать как и списки обычные (ПКМ на иконке, скопировать, вставить).
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Спасибо вам огромное, очень выручили. Но вы тоже поймите, я сегодня первый раз услышал, что есть какие-то Библиотеки - GAC + Директивы using. :D Вы мне открыли глаза...
Может вы еще знаете библиотеки, которые помогут легче просчитывать проценты, что бы не было как сейчас?
JavaScript:
{-Variable.LootFarm_VUHOD_Rybli-}-{-Variable.LootFarm_VUHOD_Rybli-}*0.07
Так я в предыдущем посте прирепил ваш переделанный шаб - "Test Newtonsoft_Json orka13.xmlz", там ведь все GAC + Директивы using уже прикреплены. Их можно с проекта в проект скопировать как и списки обычные (ПКМ на иконке, скопировать, вставить).
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
А как быть если есть другой тип Json?
JSON:
{"success":true,"lowest_price":"83,19 p\u0443\u0431.","volume":"65","median_price":"83,10 p\u0443\u0431."}
C#:
JToken JToken1 = JValue.Parse(project.Variables["Steam_Cena_pokupki_v_Steam"].Value); // тут код ответа из https://loot.farm/fullprice.json
for (int i1=0; i1<JToken1.Count(); i1++) {
    JToken JToken2 = JToken1.ElementAt(i1);
    if (JToken2["success"].ToString() == project.Variables["SKINS_Imya_Tovara"].Value) {
        project.SendInfoToLog(JToken2.ToString(), false);
        //Выбираем любое свойство какое надо отдать:
        return JToken2["lowest_price"].ToString(); // вернет сразу "99"
         }
}
throw new Exception ("искали, искали. и нифига не нашли!!!"); {
В переменной SKINS_Imya_Tovara - true
Как лучше будет найти данные из этой json?


Так я в предыдущем посте прирепил ваш переделанный шаб - "Test Newtonsoft_Json orka13.xmlz", там ведь все GAC + Директивы using уже прикреплены. Их можно с проекта в проект скопировать как и списки обычные (ПКМ на иконке, скопировать, вставить).
 
Последнее редактирование:

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
А как быть если есть другой тип Json?
JSON:
{"success":true,"lowest_price":"83,19 p\u0443\u0431.","volume":"65","median_price":"83,10 p\u0443\u0431."}
C#:
JToken JToken1 = JValue.Parse(project.Variables["Steam_Cena_pokupki_v_Steam"].Value); // тут код ответа из https://loot.farm/fullprice.json
for (int i1=0; i1<JToken1.Count(); i1++) {
    JToken JToken2 = JToken1.ElementAt(i1);
    if (JToken2["success"].ToString() == project.Variables["SKINS_Imya_Tovara"].Value) {
        project.SendInfoToLog(JToken2.ToString(), false);
        //Выбираем любое свойство какое надо отдать:
        return JToken2["lowest_price"].ToString(); // вернет сразу "99"
         }
}
throw new Exception ("искали, искали. и нифига не нашли!!!"); {
В переменной SKINS_Imya_Tovara - true
Как лучше будет найти данные из этой json?
Здесь простой джейсон всего на 1 элемент, не надо в цикле перебирать все дочерние элементы, так как их тут нет. хватит вот так:
C#:
JToken JToken1 = JValue.Parse(project.Variables["Steam_Cena_pokupki_v_Steam"].Value); // тут код ответа из https://loot.farm/fullprice.json
project.SendInfoToLog(JToken1["success"].ToString(), false);
if (JToken1["success"].ToString().ToLower() == project.Variables["SKINS_Imya_Tovara"].Value.ToLower()) {
    project.SendInfoToLog(JToken1.ToString(), false);
    //Выбираем любое свойство какое надо отдать:
    return JToken1["lowest_price"].ToString(); // вернет сразу "99"
}
else {
  throw new Exception ("искали, искали. и нифига не нашли!!!");
}
Вижу логику вы поняли. Вот только я там при сравнении привожу оба варианта к нижнему регистру, а то по логу видно будет что там имеено как "True" может свойство выводить.
А насчет процентов, то лучше делайте как делаете, если результат норм. а то по феншую там надо арифметические операции в C# делать, но там сложнее преобразовывать разные типы данных и т.д.
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Что-то не выходит:
Выполнение действия CSharp OwnCode: Добавляем символ \ к строчке с именем. Error reading JToken from JsonReader. Path '', line 0, position 0.

C#:
JToken JToken1 = JValue.Parse(project.Variables["Steam_Cena_pokupki_v_Steam"].Value); // тут код ответа из https://loot.farm/fullprice.json
project.SendInfoToLog(JToken1["success"].ToString(), false);
if (JToken1["success"].ToString().ToLower() == project.Variables["SKINS_Imya_Tovara"].Value.ToLower()) {
    project.SendInfoToLog(JToken1.ToString(), false);
    //Выбираем любое свойство какое надо отдать:
    return JToken1["lowest_price"].ToString(); // вернет сразу "99"
}
else {
  throw new Exception ("искали, искали. и нифига не нашли!!!");
}
И как мне вместо переменной ["SKINS_Imya_Tovara"]., напрямую вставить true? Где я могу прочесть про пути к тексту?


Здесь простой джейсон всего на 1 элемент, не надо в цикле перебирать все дочерние элементы, так как их тут нет. хватит вот так:
C#:
JToken JToken1 = JValue.Parse(project.Variables["Steam_Cena_pokupki_v_Steam"].Value); // тут код ответа из https://loot.farm/fullprice.json
project.SendInfoToLog(JToken1["success"].ToString(), false);
if (JToken1["success"].ToString().ToLower() == project.Variables["SKINS_Imya_Tovara"].Value.ToLower()) {
    project.SendInfoToLog(JToken1.ToString(), false);
    //Выбираем любое свойство какое надо отдать:
    return JToken1["lowest_price"].ToString(); // вернет сразу "99"
}
else {
  throw new Exception ("искали, искали. и нифига не нашли!!!");
}
Вижу логику вы поняли. Вот только я там при сравнении привожу оба варианта к нижнему регистру, а то по логу видно будет что там имеено как "True" может свойство выводить.
А насчет процентов, то лучше делайте как делаете, если результат норм. а то по феншую там надо арифметические операции в C# делать, но там сложнее преобразовывать разные типы данных и т.д.
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Проблема скорее всего в ответе сервиса. Видать там уже не джейсон а ошибка, или другой вид джейсона. Это все надо учитывать и подстраивать логику.
Если сравнивать с текстом а не с переменной, то вот так (только всегда в нижнем регистре текст вводить):
C#:
if (JToken1["success"].ToString().ToLower() == "true")
 
  • Спасибо
Реакции: Gunjubasik

Кто просматривает тему: (Всего: 5, Пользователи: 0, Гости: 5)