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

  • Автор темы Автор темы soprano
  • Дата начала Дата начала

soprano

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

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

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

Сниппет для сложения (проверил, работает):
C#:
Развернуть Свернуть Копировать
string list_name = "123"; //список который должен существовать в шаблоне
return project.Lists[list_name].Select(int.Parse).Sum();
 
Последнее редактирование:
  • Спасибо
Реакции: soprano
что за json такой с одинаковыми ключами?
 
Хочу регуляркой.
Пожалуйста
C#:
Развернуть Свернуть Копировать
MatchCollection mc = Regex.Matches(resultGet, @"(?<=quantity"":).*?(?=,""ready)");
int q = 0;
foreach(Match m in mc)
    q += int.Parse(m.Value);
string Quant = q.ToString();
 
  • Спасибо
Реакции: inilim
Пожалуйста
C#:
Развернуть Свернуть Копировать
MatchCollection mc = Regex.Matches(resultGet, @"(?<=quantity"":).*?(?=,""ready)");
int q = 0;
foreach(Match m in mc)
    q += int.Parse(m.Value);
string Quant = q.ToString();
Сейчас проверю, никуда не уходи..
 
регуляркой в список
(?<="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
"Name":one,"quantity":1,"ready", "Name":two,"quantity":12,"ready", "Name":three,"quantity":10,"ready"
Тут еще нужно учесть, если в конце json'а будет "quantity ", регулярка его не возьмет и не посчитает.
Регулярка цепляется за начало следующего ключа "ready".
Дай весь ответ от сервера.
 
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
регуляркой в список
(?<="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
Всё хорошо, но не забирает регулярка из запроса нужное значение, да ещё в цикле. Даже в тестере при правильной регулярке куски кода непонятно как забирает.
Придётся с Json бороться..
 
Всё хорошо, но не забирает регулярка из запроса нужное значение, да ещё в цикле. Даже в тестере при правильной регулярке куски кода непонятно как забирает.
Придётся с Json бороться..

Код:
Развернуть Свернуть Копировать
(?<=quantity":)\d+
 
Последнее редактирование:
Всё хорошо, но не забирает регулярка из запроса нужное значение, да ещё в цикле. Даже в тестере при правильной регулярке куски кода непонятно как забирает.
Придётся с Json бороться..
Дай весь ответ от сервера. А вообще правильно будет разобрать json.
 
Нужно извлечь регуляркой все цифры - 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
Последний код - то что надо, спасибо.
Но одна неприятность.
Забирается и складывается то что надо, но код не завершается а регулярка почему то гребёт после выполнения последнего сложения уже не цифры, а целые куски кода типа
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:
 
Последнее редактирование:
Как в коде выше обработать исключение, чтобы если значение не цифры и больше, скажем, 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
Спасибо, там максимальная цифра до 1.000.000, так что не страшно.
Но ваш код правильнее.
 

Похожие темы

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