Как изввлечь все цифры из GET запроса

soprano

Client
Регистрация
25.08.2011
Сообщения
924
Благодарностей
1 043
Баллы
93
GET-запросом получаю следующие данные:
C#:
"Name":one,"quantity":1,"ready", "Name":two,"quantity":12,"ready", "Name":three,"quantity":10,"ready"
Нужно извлечь регуляркой все цифры - 1, 12, 10 и сложить их 1 + 10 + 12 = получается 23
Регулярка такая
C#:
string Quant = Regex.Match(resultGet, @"(?<=quantity"":).*?(?=,""ready)").Value;
Что-то я торможу, как сделать попроще.
Может, кто подскажет?
 

LiMe

Client
Регистрация
10.12.2015
Сообщения
627
Благодарностей
345
Баллы
63
GET-запросом получаю следующие данные:
C#:
"Name":one,"quantity":1,"ready", "Name":two,"quantity":12,"ready", "Name":three,"quantity":10,"ready"
Нужно извлечь регуляркой все цифры - 1, 12, 10 и сложить их 1 + 10 + 12 = получается 23
Регулярка такая
C#:
string Quant = Regex.Match(resultGet, @"(?<=quantity"":).*?(?=,""ready)").Value;
Что-то я торможу, как сделать попроще.
Может, кто подскажет?
Как вариант взять с помощью регулярного выражения - \d{1,2} и дальше сложить числа.
 

soprano

Client
Регистрация
25.08.2011
Сообщения
924
Благодарностей
1 043
Баллы
93
Как вариант взять с помощью регулярного выражения - \d{1,2} и дальше сложить числа.
Не, так не пойдёт, в ответе запроса есть много цифр других, надо именно такой регуляркой.
 

LiMe

Client
Регистрация
10.12.2015
Сообщения
627
Благодарностей
345
Баллы
63
Не, так не пойдёт, в ответе запроса есть много цифр других, надо именно такой регуляркой.
Тогда ваш вариант самый подходящий, я просто не очень понимаю, что вы хотите оптимизировать в этом моменте :-)
 

soprano

Client
Регистрация
25.08.2011
Сообщения
924
Благодарностей
1 043
Баллы
93
Этой регуляркой я получаю данные только отсюда
C#:
"Name":one,"quantity":1
То есть только 1.
МНЕ НУЖЕН СНИППЕТ или подсказка, как получить все данные этой регуляркой из запроса.
 

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 840
Благодарностей
1 463
Баллы
113
Этой регуляркой я получаю данные только отсюда
C#:
"Name":one,"quantity":1
То есть только 1.
МНЕ НУЖЕН СНИППЕТ или подсказка, как получить все данные этой регуляркой из запроса.
Регуляркой (?<="quantity":-)[\w\W]*?(?=,) сразу все числа в список, потом уже все числа в списке сложить, нет?
 

soprano

Client
Регистрация
25.08.2011
Сообщения
924
Благодарностей
1 043
Баллы
93

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 840
Благодарностей
1 463
Баллы
113
Сниппет не нарисую, не силен. Кубиком решается )))

ps. В общем, сперва регуляркой ВСЕ найденные решения - в список. Потом все строки списка складываем, решение - здесь. Там еще надо в числа перевести.

Сниппет для сложения (проверил, работает):
C#:
string list_name = "123"; //список который должен существовать в шаблоне
return project.Lists[list_name].Select(int.Parse).Sum();
 
Последнее редактирование:
  • Спасибо
Реакции: soprano

inilim

Client
Регистрация
16.09.2017
Сообщения
446
Благодарностей
170
Баллы
43
что за json такой с одинаковыми ключами?
 

soprano

Client
Регистрация
25.08.2011
Сообщения
924
Благодарностей
1 043
Баллы
93

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 430
Баллы
113
  • Спасибо
Реакции: inilim

soprano

Client
Регистрация
25.08.2011
Сообщения
924
Благодарностей
1 043
Баллы
93

inilim

Client
Регистрация
16.09.2017
Сообщения
446
Благодарностей
170
Баллы
43
регуляркой в список
(?<="quantity":)[0-9]+(?=,")
потом C#
C#:
var list = project.Lists["spisok"];//название списка проекта
double summa = 0;//объявляем переменную, в которую будем считать сумму
foreach(string s in list){//в цикле перебираем список и не важно, какое количество строк там будет
    try{//на всякий случай поймаем возможное исключение
        summa+=double.Parse(s);//суммируем, приводя к необходимому типу
    }catch{project.SendInfoToLog(string.Format("Среди строк с числами закралась строка с НЕ числом: {0}", s), true);}//и выведем в лог строку, которая не является числом
}
return summa;//возвращаем из кубика сумму - в настройках кубика необходимо указать переменную для вывода
Решение выше лучше, но я бы поправил регулярку.
 
  • Спасибо
Реакции: Alexmd

inilim

Client
Регистрация
16.09.2017
Сообщения
446
Благодарностей
170
Баллы
43
"Name":one,"quantity":1,"ready", "Name":two,"quantity":12,"ready", "Name":three,"quantity":10,"ready"
Тут еще нужно учесть, если в конце json'а будет "quantity ", регулярка его не возьмет и не посчитает.
Регулярка цепляется за начало следующего ключа "ready".
Дай весь ответ от сервера.
 
Регистрация
05.06.2019
Сообщения
603
Благодарностей
486
Баллы
63
C#:
string source = "\"Name\":one,\"quantity\":1,\"ready\", \"Name\":two,\"quantity\":12,\"ready\", \"Name\":three,\"quantity\":10,\"ready\"";
return Regex.Matches(source, @"(?<=quantity\":)\d+").Cast<Match>().Select(x=> int.Parse(x.ToString())).Sum().ToString();
 
Последнее редактирование:
  • Спасибо
Реакции: Alexmd

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 430
Баллы
113
регуляркой в список
(?<="quantity":)[0-9]+(?=,")
потом C#
C#:
var list = project.Lists["spisok"];//название списка проекта
double summa = 0;//объявляем переменную, в которую будем считать сумму
foreach(string s in list){//в цикле перебираем список и не важно, какое количество строк там будет
    try{//на всякий случай поймаем возможное исключение
        summa+=double.Parse(s);//суммируем, приводя к необходимому типу
    }catch{project.SendInfoToLog(string.Format("Среди строк с числами закралась строка с НЕ числом: {0}", s), true);}//и выведем в лог строку, которая не является числом
}
return summa;//возвращаем из кубика сумму - в настройках кубика необходимо указать переменную для вывода
Решение выше лучше, но я бы поправил регулярку.
Знакомые строчки кода) https://zennolab.com/discussion/threads/kak-summirovat-v-c-chisla-iz-spiska.85796/post-576668
 
  • Спасибо
Реакции: inilim

inilim

Client
Регистрация
16.09.2017
Сообщения
446
Благодарностей
170
Баллы
43

soprano

Client
Регистрация
25.08.2011
Сообщения
924
Благодарностей
1 043
Баллы
93
Всё хорошо, но не забирает регулярка из запроса нужное значение, да ещё в цикле. Даже в тестере при правильной регулярке куски кода непонятно как забирает.
Придётся с Json бороться..
 
Регистрация
05.06.2019
Сообщения
603
Благодарностей
486
Баллы
63
Всё хорошо, но не забирает регулярка из запроса нужное значение, да ещё в цикле. Даже в тестере при правильной регулярке куски кода непонятно как забирает.
Придётся с Json бороться..
Код:
(?<=quantity":)\d+
 
Последнее редактирование:

inilim

Client
Регистрация
16.09.2017
Сообщения
446
Благодарностей
170
Баллы
43
Всё хорошо, но не забирает регулярка из запроса нужное значение, да ещё в цикле. Даже в тестере при правильной регулярке куски кода непонятно как забирает.
Придётся с Json бороться..
Дай весь ответ от сервера. А вообще правильно будет разобрать json.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 652
Баллы
113

soprano

Client
Регистрация
25.08.2011
Сообщения
924
Благодарностей
1 043
Баллы
93

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 974
Благодарностей
1 720
Баллы
113
Нужно извлечь регуляркой все цифры - 1, 12, 10 и сложить их 1 + 10 + 12 = получается 23
C#:
int number = 0;
string text = @"""Name"":one,""quantity"":1,""ready"", ""Name"":two,""quantity"":12,""ready"", ""Name"":three,""quantity"":10,""ready""";
MatchCollection matches = Regex.Matches(text, @"\d+");
foreach(var m in matches){
number += int.Parse(m.ToString());
}
project.Variables["result"].Value = number.ToString();
 
  • Спасибо
Реакции: soprano

soprano

Client
Регистрация
25.08.2011
Сообщения
924
Благодарностей
1 043
Баллы
93
Последний код - то что надо, спасибо.
Но одна неприятность.
Забирается и складывается то что надо, но код не завершается а регулярка почему то гребёт после выполнения последнего сложения уже не цифры, а целые куски кода типа
C#:
id":1,"sizeName":"XS","sizeNameRus":"42","dimensions":[],"characteristicId":49369487,"priceWithSale":5130,"price":9500,"quantity":1,"isSoldOut":false,"lowQuantity":false,"sale":46,"creditEnabled":false,"storeIds":[507],"hasPreorder":false,"sellerEnabled":false},"49369485":{"addToSellerEnable":false,"addToBasketEnable":true,"addToPonedEnable":true,"addToWaitingListEnable":false,"addToPreorderEnable":false,"id":2,"sizeName":"S","sizeNameRus":"44","dimensions":[],"characteristicId":49369485,"priceWithSale":5130,"price":
Как в коде выше обработать исключение, чтобы если значение не цифры и больше, скажем, 7 знаков - в топку.?

Вроде победил. В переборе добавил
C#:
if(m.Length > 8) break;
и получилось без ошибки.
Спасибо всем..:ay:
 
Последнее редактирование:

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 974
Благодарностей
1 720
Баллы
113
Как в коде выше обработать исключение, чтобы если значение не цифры и больше, скажем, 7 знаков - в топку.?
правильно будет так:

C#:
int number = 0;
int maxNumber = 8;
string text = project.Variables["test"].Value;
MatchCollection matches = Regex.Matches(text, @"\d+");
foreach(var m in matches){
    if(m.ToString().Length <= maxNumber){
number += int.Parse(m.ToString());
    }
}
project.Variables["result"].Value = number.ToString();
А в вашем коде цикл будет выполняться до тех пор, пока количество символов в переменной m меньше 8.
Наглядно это так:

123 --> выполнит
1234 --> выполнит
12345 --> выполнит
123456789 --> выходит из цикла
1234567 --> не выполнит
123456 --> не выполнит
12 --> не выполнит

тем самым ваш код, обработает не все нужные вам данные, так как половину пропустит!

а мой код:

123 --> выполнит
1234 --> выполнит
12345 --> выполнит
123456789 --> пропустит при проверке и пойдет дальше
1234567 --> выполнит
123456 --> выполнит
12 --> выполнит
 
  • Спасибо
Реакции: soprano

soprano

Client
Регистрация
25.08.2011
Сообщения
924
Благодарностей
1 043
Баллы
93
Спасибо, там максимальная цифра до 1.000.000, так что не страшно.
Но ваш код правильнее.
 

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