Упрощенный парсинг строк

markers 52 3 2

Если хочется упросить парсинг строк, то можно воспользоваться этой функцией

Введение

Как-то потребовалось мне написать функцию разбора URL (она опубликована тут) и сразу захотелось упросить себе жизнь. В результате несколькоих итераций и родилась данная функция

Где код?

Функция РаспарситьСтроку(Строка,
	Знач ПозицияСЛева = Неопределено, ПодстрокаСЛева = Неопределено, ВключаетПодстрокуСЛева = Ложь,
	Знач ПозицияСПрава = Неопределено, ПодстрокаСПрава = Неопределено, ВключаетПодстрокуСПрава = Ложь)
	
	РезультатПарсинга = Новый Структура;
	РезультатПарсинга.Вставить("Успех", Ложь);
	РезультатПарсинга.Вставить("ВырезНачало", 0);
	РезультатПарсинга.Вставить("ВырезКонец", 0);
	РезультатПарсинга.Вставить("Вырез", "");
	
	Если ПозицияСЛева = Неопределено и ПодстрокаСЛева = Неопределено и
		ПозицияСПрава = Неопределено и ПодстрокаСПрава = Неопределено Тогда
		
		Возврат РезультатПарсинга;
		
	КонецЕсли;
	
	// Ищем начальную позицию
	ПозицияСЛеваДляПоиска = Неопределено;
	
	Если ПозицияСЛева = Неопределено и ПодстрокаСЛева = Неопределено Тогда
		
		ПозицияСЛева = 1; // Критериев начала выреза не задано, значит берем начало строки
		
	ИначеЕсли ПодстрокаСЛева <> Неопределено Тогда
		
		ПозицияСЛева = СтрНайти(Строка, ПодстрокаСЛева,, ?(ПозицияСЛева = Неопределено, 1, ПозицияСЛева));
		ПозицияСЛеваДляПоиска = ПозицияСЛева + СтрДлина(ПодстрокаСЛева);
		
		Если ПозицияСЛева = 0 Тогда
			
			Возврат РезультатПарсинга;
			
		ИначеЕсли Не ВключаетПодстрокуСЛева Тогда
			
			ПозицияСЛева = ПозицияСЛева + СтрДлина(ПодстрокаСЛева);
			
		КонецЕсли;
		
	КонецЕсли;
	
	// Ищем конечную позицию
	Если ПозицияСПрава = Неопределено и ПодстрокаСПрава = Неопределено Тогда
		
		ПозицияСПрава = СтрДлина(Строка) + 1; // Критериев окончания выреза не задано, значит берем до конца строки
		
	ИначеЕсли ПодстрокаСПрава <> Неопределено Тогда
		
		НачальнаяПозицияПоиска = ?(ПозицияСЛеваДляПоиска = Неопределено, ПозицияСЛева, ПозицияСЛеваДляПоиска);
		
		Если ПозицияСПрава <> Неопределено и ПозицияСПрава > НачальнаяПозицияПоиска Тогда
			
			НачальнаяПозицияПоиска = ПозицияСПрава;
			
		КонецЕсли;
		
		ПозицияСПрава = СтрНайти(Строка, ПодстрокаСПрава,, НачальнаяПозицияПоиска);
		
		Если ПозицияСПрава = 0 Тогда
			
			Возврат РезультатПарсинга;
			
		ИначеЕсли ВключаетПодстрокуСПрава Тогда
			
			ПозицияСПрава = ПозицияСПрава + СтрДлина(ПодстрокаСПрава);
			
		КонецЕсли;
		
	КонецЕсли;
	
	РезультатПарсинга.Успех = Истина;
	РезультатПарсинга.ВырезНачало = ПозицияСЛева;
	РезультатПарсинга.ВырезКонец = ПозицияСПрава;
	РезультатПарсинга.Вырез = Сред(Строка, ПозицияСЛева, ПозицияСПрава - ПозицияСЛева);
	
	Возврат РезультатПарсинга;
	
КонецФункции

Что на входе?

Строка - Подаем ей на вход исходную строку, после задаем параметры выреза из строки:
ПозицияСЛева - Начиная с какого смивола с левой стороны вырезать, может сочетаться со следующим параметром, а так-же может быть опущен, тогда берется начало строки
ПодстрокаСЛева - Подстрока поиска начала выреза, если указан ещё и параметр ПозицияСЛева, то ищет начиная от указанной позиции. Может быть опущен.
Внимание! Если ПозицияСЛева и ПодстрокаСЛева опущены - берется начало строки
ВключаетПодстрокуСЛева - В случае поиска левой позиции по подстроке, указывает на необходимость включать искомое значение в возвращаемое значение

ПозицияСПрава - До какого символа с правой стороны вырезать, может сочетаться со следующим параметром. Может быть опущен
ПодстрокаСПрава - Подстрока поиска окончания выреза, если указан ещё и параметр ПозицияСПрава, то ищет начиная с указанной позиции. Может быть опущен.
Внимание! Если ПозицияСПрава и ПодстрокаСПрава опущены, то берется значение до конца строки
ВключаетПодстрокуСПрава - В случае поиска правой позиции по подстроке, указывает на необходимость включать искомое значение в возвращаемое значение

Что на выходе?

Функция возвращает структуру со следующими свойствами:
Успех - Удалось ли получить значение по переданным параметрам
ВырезНачало - Позиция исходной строки, с которой произведен вырез
ВырезКонец - Позиция исходной строки, до которой произведен вырез
Вырез - Собственно вырезанное значение по заданным параметрам

Примеры?

  1. Получить протокол из строки с URL: Результат = РаспарситьСтроку(URL,,,,, "://");
  2. Получить значение между / и /, включая их в результат: Результат(URL, НачальнаяПозицияПоиска, "/", Истина,, "/", Истина);
0

См. также

Пример использования регулярных выражений RegExp в 1С

Парсинг URL

УпрощенныйИнтерфейсНастройкиПравДоступа (БСП)

Строка в дату по форматной строке

ФорматированнаяСтрокаИзHTML (БСП)

Определение длины строки в запросе

НормализованнаяСтрокаXML (БСП)

СтрокаИзСтруктурыJSON (БСП)

СтруктураИзСтрокиJSON (БСП)

Модератору