Помогите решить задачу (1С)

Водится строка, содержащая буквы, целые неотрицательные числа и иные символы. Требуется все числа, которые встречаются в строке, поместить в строку разделив запятой с пробелом. Например, если дана строка "data 48 call 9 read13 blank0a", то в строке ответ должны оказаться числа 48, 9, 13 и 0.


Ответы (1 шт):

Автор решения: Бауржан Мамыш
Функция ЗадачаСоStackOverflow(ИсходнаяСтрока)

ДлинаИсходнойСтроки = СтрДлина(ИсходнаяСтрока);
Цифры = "0123456789";
РезультирующаяСтрока = "";
ЧислоСтрокой = ""; 

Для НомерСимвола = 1 по ДлинаИсходнойСтроки Цикл
//Считываем очередной символ из исходной строки
СимволИсходнойСтроки = Сред(ИсходнаяСтрока,НомерСимвола,1);   

 Если СтрНайти(Цифры, СимволИсходнойСтроки) <> 0 Тогда
    //Собираем число из цифр в строку
    ЧислоСтрокой = ЧислоСтрокой + СимволИсходнойСтроки; 
 Иначе
 //Очередной символ НЕ число
 //тогда проверяем было ли сформировано число 
 //если да то записываем его в результирующую строку и очищаем его
  Если НЕ ПустаяСтрока(ЧислоСтрокой) Тогда
   РезультирующаяСтрока = РезультирующаяСтрока + ЧислоСтрокой + ", ";  
  ЧислоСтрокой = "";
 КонецЕсли;
КонецЕсли; 

КонецЦикла; 

//уберем лишнюю запятую с пробелом из результирующей строки
РезультирующаяСтрока = 
Лев(РезультирующаяСтрока, СтрДлина(РезультирующаяСтрока)-2);

Возврат  РезультирующаяСтрока;

КонецФункции

Функция ЗадачаСоStackOverflow_2(ИсходнаяСтрока)

 ДлинаИсходнойСтроки  = СтрДлина(ИсходнаяСтрока);
 Цифры                = "0123456789";
 РезультирующаяСтрока = "";
 ЧислоСтрокой         = ""; 

 //[1] Инициализация пустой строкой, при первом заходе пригодится
 ЗапятаяСПробелом     = "";

 Для НомерСимвола = 1 по ДлинаИсходнойСтроки Цикл  
  СимволИсходнойСтроки = Сред(ИсходнаяСтрока, НомерСимвола, 1);   

  Если СтрНайти(Цифры, СимволИсходнойСтроки) <> 0 Тогда    
   ЧислоСтрокой = ЧислоСтрокой + СимволИсходнойСтроки; 
  Иначе   
   Если НЕ ПустаяСтрока(ЧислоСтрокой) Тогда
    //[2] Поменяем форимрование итоговой строки
    //теперь добавляем ее перед числовой строкой
    РезультирующаяСтрока = РезультирующаяСтрока + ЗапятаяСПробелом + ЧислоСтрокой;  
    ЧислоСтрокой = "";
    //[3] Начиная со второго прохода это запятая с пробелом
    ЗапятаяСПробелом = ", ";
   КонецЕсли;
  КонецЕсли; 

 КонецЦикла; 

 //Для случая когда строка заканчивается числом
 Если НЕ ПустаяСтрока(ЧислоСтрокой) Тогда
  РезультирующаяСтрока = РезультирующаяСтрока + ЗапятаяСПробелом + ЧислоСтрокой;  
 КонецЕсли;


 Возврат РезультирующаяСтрока;

КонецФункции 

Функция ЗадачаСоStackOverflow_3(ИсходнаяСтрока)
 
 ДлинаИсходнойСтроки  = СтрДлина(ИсходнаяСтрока);
 Цифры                = "0123456789";
 РезультирующаяСтрока = "";
 ЧислоСтрокой         = ""; 
 
 //[1] Теперь возмем массив куда будем совать найденные числа
 МассивНайденныхЧисел = Новый Массив();

 Для НомерСимвола = 1 по ДлинаИсходнойСтроки Цикл  
  СимволИсходнойСтроки = Сред(ИсходнаяСтрока, НомерСимвола, 1);     

  Если СтрНайти(Цифры, СимволИсходнойСтроки) <> 0 Тогда    
   
   ЧислоСтрокой = ЧислоСтрокой + СимволИсходнойСтроки; 
  Иначе
   Если НЕ ПустаяСтрока(ЧислоСтрокой) Тогда
    //[2] Нашли - добавили
    МассивНайденныхЧисел.Добавить(ЧислоСтрокой);
    ЧислоСтрокой = "";
   КонецЕсли;    
  КонецЕсли; 
 КонецЦикла;

 //Если Строка заканчивается "числом"
 Если НЕ ПустаяСтрока(ЧислоСтрокой) Тогда    
   МассивНайденныхЧисел.Добавить(ЧислоСтрокой);    
 КонецЕсли;  

 //[3] Отправили массив в матрицу к нео - получили запятые на своих местах (сработает с 8.3.6)
 РезультирующаяСтрока = СтрСоединить(МассивНайденныхЧисел, ", ");

 Возврат РезультирующаяСтрока;

КонецФункции
→ Ссылка