Функция поиска строки между маркерами из моей библиотеки функций

Понадобилось на проекте выделять строку между двумя маркерами. Поискал в интернете — ничего не нашел. Хотел уж было писать заново, но вспомнил, что где-то у меня пылится моя библиотека функций. Посмотрел — а она хранится в виде CF-файла. Открыл и нашел там нужную функцию:

Функция НайтиСтрокуМежду(ИсхСтр, МаркерНачала, МаркерКонца, УчитыватьРегистр = ложь) Экспорт
//Назначение: Заменяет текст в строке между маркерами, результат замены возвращает
//ДатаСоздания: 20090114
//Автор: Fixin
//Тестирована: Нет
//$МаркерНачала: Маркер начала
//$МаркерКонца: Маркер конца
//$ИсхСтр: Исходная строка
//$СтрЗамены: На что заменяем
//$ОставлятьМаркеры: Нужно ли оставлять маркеры в строке-результате
//$Середина: В эту переменную возвращается то, что было между маркерами (можно использовать для поиска)
//Тесты:
//	Сообщить(бфстроки.НайтиСтрокуМежду("абв","а","в")); //б
//	Сообщить(бфстроки.НайтиСтрокуМежду("абв","а",""));  //бв
//	Сообщить(бфстроки.НайтиСтрокуМежду("абв","","б"));  //а


	Перем С;
	
	С=ИсхСтр;
	Если МаркерНачала = "" Тогда
		Поз1 = 1;
	Иначе
		Поз1 = НайтиПодстроку(С, МаркерНачала ,,, УчитыватьРегистр);
		Если Поз1=0 Тогда
			Возврат "";
		КонецЕсли;
	КонецЕсли;
	
	Начало=Лев(С, Поз1-1);
	Хвост=Сред(С, Поз1+СтрДлина(МаркерНачала));
	Если МаркерКонца = "" Тогда
		Поз2 = СтрДлина(Хвост) + 1;
	Иначе
		Поз2 = НайтиПодстроку(Хвост, МаркерКонца,,, УчитыватьРегистр);
		Если Поз2=0 Тогда
			Возврат "";
		КонецЕсли;
	КонецЕсли;
	Середина=Лев(Хвост, Поз2-1);
	Возврат Середина;
КонецФункции  

Функция НайтиПодстроку(Знач Строка, Знач ПодстрокаПоиска, НачальнаяПозиция=1, НомерВхождения=1, УчитыватьРегистр = ложь) Экспорт
//Назначение: Продвинутый поиск в строке 
//ДатаСоздания: 20071217
//$Строка: Строка, в которой ищем
//$ПодстрокаПоиска: Строка, которую ищем
//Автор: Fixin
//Тестирована: 

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

Надо же, функция 2009 года пригодилась 14 лет спустя. Поразительно!

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *