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

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 |  Дата:   Прочитано: 66834
 +6 
Распечатать
Возможно, вас также заинтересует
Выбор оптимального алгоритма для разбора строки в массив 0
Столкнулся с проблемой: ПолучитьСтрокуПоНомеру() медленно отрабатывает на входных данных 100 000 строк. Как сделать бытсрее? // Пример Defender aka LINN ВремяНачала = ТекущаяДата(); Сообщить(" Обработка начата: " + ВремяНачала); ТЗ = Новый Та
Использование регулярных выражений (RegExp) в 1С 1
Регулярные выражения (Regular Expressions) являются известным и мощным средством для поиска, тестирования и замены подстрок. Эта технология доступна и в 1С - через объект VBScript.RegExp. Нужный объект уже встроен в современные версии Windows (начин
Как мы писали парсер сайта с ценами для 1С 1
Недавно, мой постоянный клиент решил проводить маркетинговые исследования по изменению цен на товары у конкурентов... и эти данные захотел использовать в 1С в связке с его прайс-листом + куча отчетов с графиками и процентным отклонением от цен основ
Как напечатать документ на определенном принтере из сеанса RDP (Терминал) 5
В 1С есть возможность обратиться к принтеру по имени перед печатью, однако при работе через терминал к названию принтера добавляется (перенаправлено N), где N постоянно меняется. Решение следующее: НаКлиенте Функция ИмяПринтераRDP(ИмяПринтера) S
Как проверить наличие русских букв в строке? 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 По СтрЧислоСтрок(ВремМногострочнТекст) Цикл МассивСтрок.Добавить(СтрПолучитьСтроку(ВремМногострочнТекст, Счетчик)); КонецЦикла; Возврат МассивСтрок;КонецФункции

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