helpf.pro
Регистрация
 +3 
Распечатать

1С 8.x : Функция разбора (разложения) строки в массив

Данные функции позволяют разложить строку в массив, используя заданный разделитель
Например есть строка: абв$dfd$232$-0oj$5
Выполнив код: НашМассив = РазложитьСтрокуВМассив(абв$dfd$232$-0oj$5, "$") ;
Получим: НашМассив = абв
dfd
232
-0oj
5
Код 1C v 8.х
 
// Функция "расщепляет" строку на подстроки, используя заданный
// разделитель. Разделитель может иметь любую длину.
// Если в качестве разделителя задан пробел, рядом стоящие пробелы
// считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр
// игнорируются.
// Например,
// РазложитьСтрокуВМассивПодстрок(",ку,,,му", ",") возвратит массив значений из пяти элементов,
// три из которых - пустые строки, а
// РазложитьСтрокуВМассивПодстрок(" ку му", " ") возвратит массив значений из двух элементов
//
// Параметры:
// Стр - строка, которую необходимо разложить на подстроки.
// Разделитель - строка-разделитель, по умолчанию - запятая.
//
// Возвращаемое значение:
// массив значений, элементы которого - подстроки
//
Функция РазложитьСтрокуВМассив(Знач Стр, Разделитель = ",") Экспорт

МассивСтрок = Новый Массив();
Если Разделитель = " " Тогда
Стр = СокрЛП(Стр);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
КонецЦикла;
Иначе
ДлинаРазделителя = СтрДлина(Разделитель);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = Сред(Стр,Поз+ДлинаРазделителя);
КонецЦикла;
КонецЕсли;

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


Пример с использованием предустановленной библиотеки RegExp, т.е. она есть в любом windows.
Плюсы RegExp:
1. Хорошая скорость анализа, т.к. 1С анализ строк (разбор) обычно реализуется циклами и функциями: Лев, Прав, Сред, Найти, а встроенный язык медленный
2. Высокая читаемость и модифицированность (более предсказуем в случае несоответствия строки - разбору)
3. Дополнительный функционал (можно осуществлять анализ, замену и проверку строковых выражений)

Минусы RegExp:
1. Не все задачи можно решить (например рекурсивные разборы тип 1 + (2+3*(2-7)) в случае если нужно разобрать на выражения в скобках) приходится смешивать с кодом.
2. Возможность зависания при использовании сложных шаблонов(редкость, но бывает).
3. RegExp - это дополнительная библиотека и инициализация занимает значительное время.

Код 1C v 8.х
  // Пример с использованием предустановленной библиотеки RegExp, т.е. она есть в любом windows.
Функция РазложитьСтрокуВМассив(Строка, Разделитель = ",") Экспорт
RegExp = Новый COMОбъект("VBScript.RegExp"); // создаем объект для работы с регулярными выражениями

//Параметры:
RegExp.MultiLine = Ложь; // истина — текст многострочный, ложь — одна строка
RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = Ложь; // истина — игнорировать регистр строки при поиске

//Разбор строки вида 1,СЛОВО,(1+2); Маска для разделителя ',' [^\,]*"
RegExp.Pattern = "[^\" + Разделитель + "]+";
Matches = RegExp.Execute (Строка);

Массив = Новый Массив;

Для Сч = 0 По Matches.Count - 1 Цикл
Массив.Добавить(Matches.Item(Сч).Value);
КонецЦикла;

RegExp = Неопределено;

Возврат Массив;
КонецФункции


Посмотрите Функцию разложить строку на подстроки (в список значений), используя заданный разделитель.
Разместил:   Версии: | 8.x |  Дата:   Прочитано: 25457
 +3 
Распечатать
Возможно, вас также заинтересует
Выбор оптимального алгоритма для разбора строки в массив 0
Столкнулся с проблемой: ПолучитьСтрокуПоНомеру() медленно отрабатывает на входных данных 100 000 строк. Как сделать бытсрее? // Пример Defender aka LINN ВремяНачала = ТекущаяДата(); Сообщить(" Обработка начата: " + ВремяНачала); ...
Использование регулярных выражений (RegExp) в 1С 1
Регулярные выражения (Regular Expressions) являются известным и мощным средством для поиска, тестирования и замены подстрок. Эта технология доступна и в 1С - через объект VBScript.RegExp. Нужный объект уже встроен в современные версии...
Как мы писали парсер сайта с ценами для 1С 1
Недавно, мой постоянный клиент решил проводить маркетинговые исследования по изменению цен на товары у конкурентов... и эти данные захотел использовать в 1С в связке с его прайс-листом + куча отчетов с графиками и...
Как напечатать документ на определенном принтере из сеанса RDP (Терминал) 3
В 1С есть возможность обратиться к принтеру по имени перед печатью, однако при работе через терминал к названию принтера добавляется (перенаправлено N), где N постоянно меняется. Решение следующее: НаКлиенте Функция...
Как проверить наличие русских букв в строке? 0
//рег=СоздатьОбъект(" VBScript.RegExp" ); // Для 7.7 Рег = Новый COMОбъект(" VBScript.RegExp" ); Рег.global=-1; Рег.ignorecase=-1; Рег.pattern=" " ; Сообщить(Рег.test(" есть русские bukovy" )); Сообщить(Рег.test(" netu russ bukov" ));
Посмотреть все результаты поиска похожих
Комментарии
vilnev
05.08.2016 15:46Комментарий: 2
vilnev
Код 1C v 8.х
 Функция РазложитьСтрокуВМассив(ИсхСтрока, Разделитель =",")
    
    ВремМногострочнТекст = СтрЗаменить(ИсхСтрока, Разделитель, Символы.ПС);
    МассивСтрок = Новый Массив();
    
    Для Счетчик = 1 По СтрЧислоСтрок(ВремМногострочнТекст) Цикл        
        МассивСтрок.Добавить(СтрПолучитьСтроку(ВремМногострочнТекст, Счетчик));
    КонецЦикла;
    
    Возврат МассивСтрок;
КонецФункции

vilnev
05.08.2016 15:42Комментарий: 1
vilnev

Добавлю свои 5 копеек. 

Более лаконичный способ разложить строку в массив.

Код 1с82:

Функция РазложитьСтрокуВМассив(ИсхСтрока, Разделитель =",") ВремМногострочнТекст = СтрЗаменить(ИсхСтрока, Разделитель, Символы.ПС); МассивСтрок = Новый Массив(); Для Счетчик = 1 По СтрЧислоСтрок(ВремМногострочнТекст) Цикл МассивСтрок.Добавить(СтрПолучитьСтроку(ВремМногострочнТекст, Счетчик)); КонецЦикла; Возврат МассивСтрок;КонецФункции

Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.