Функция поиска строки между маркерами из моей библиотеки функций
Понадобилось на проекте выделять строку между двумя маркерами. Поискал в интернете — ничего не нашел. Хотел уж было писать заново, но вспомнил, что где-то у меня пылится моя библиотека функций. Посмотрел — а она хранится в виде 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 лет спустя. Поразительно!
Свежие комментарии