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

soprano

Client
Регистрация
25.08.2011
Сообщения
866
Благодарностей
948
Баллы
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
Сообщения
621
Благодарностей
341
Баллы
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
Сообщения
866
Благодарностей
948
Баллы
93
Как вариант взять с помощью регулярного выражения - \d{1,2} и дальше сложить числа.
Не, так не пойдёт, в ответе запроса есть много цифр других, надо именно такой регуляркой.
 

LiMe

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

soprano

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

Moonwalker

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

soprano

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

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 674
Благодарностей
1 266
Баллы
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
Сообщения
866
Благодарностей
948
Баллы
93

Alexmd

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

soprano

Client
Регистрация
25.08.2011
Сообщения
866
Благодарностей
948
Баллы
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
Сообщения
570
Благодарностей
455
Баллы
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 423
Баллы
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
Сообщения
866
Благодарностей
948
Баллы
93
Всё хорошо, но не забирает регулярка из запроса нужное значение, да ещё в цикле. Даже в тестере при правильной регулярке куски кода непонятно как забирает.
Придётся с Json бороться..
 
Регистрация
05.06.2019
Сообщения
570
Благодарностей
455
Баллы
63
Всё хорошо, но не забирает регулярка из запроса нужное значение, да ещё в цикле. Даже в тестере при правильной регулярке куски кода непонятно как забирает.
Придётся с Json бороться..
Код:
(?<=quantity":)\d+
 
Последнее редактирование:

inilim

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

doc

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

soprano

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

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 802
Благодарностей
1 474
Баллы
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
Сообщения
866
Благодарностей
948
Баллы
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 802
Благодарностей
1 474
Баллы
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
Сообщения
866
Благодарностей
948
Баллы
93
Спасибо, там максимальная цифра до 1.000.000, так что не страшно.
Но ваш код правильнее.
 

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