Функция стрНайтиНесущуюСтроку ищет подстроку в строке,
Функция стрРазобратьПоСловам(Текст, Старт=Неопределено, Стоп=Неопределено)
Длина = СтрДлина(Текст);
рСтарт = ?( Старт = Неопределено, 1, Макс(1, Старт) );
рСтоп = ?( Стоп = Неопределено, Длина, Мин(Длина, Стоп) );
рТекст = Текст;
кНеБуквы = "=+-/*"+
"`'"""+
",.?!;:"+
"<>()[]{}"+
"@#$%^&"+
"\/|";
кРазрывы = Символы.ВК +
Символы.ВТаб +
Символы.НПП +
Символы.ПС +
Символы.ПФ +
Символы.Таб +
" ";
сНеБуквы = Новый Соответствие;
Для Сч = 1 по СтрДлина(кНеБуквы) Цикл
сНеБуквы.Вставить( Сред(кНеБуквы, Сч, 1), Истина );
КонецЦикла;
сРазрывы = Новый Соответствие;
Для Сч = 1 по СтрДлина(кРазрывы) Цикл
сРазрывы.Вставить( Сред(кРазрывы, Сч, 1), Истина );
КонецЦикла;
// -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
Слова = Новый Массив;
Начало = Неопределено;
Конец = Неопределено;
// все буквы кроме разрывов попадают в буфер
// при этом буквы группируются, не буквы по одной
Для Сч = рСтарт по рСтоп Цикл
Сим = Сред( рТекст, Сч, 1 );
флгЭтоРазрвыв = ( НЕ сРазрывы[ Сим ] = Неопределено );
Если флгЭтоРазрвыв Тогда
// это разрыв
// сброс буферов
Конец = Сч-1;
Иначе
// это не разрыв
Если Начало = Неопределено Тогда
Начало = Сч;
КонецЕсли;
флгЭтоБуква = (сНеБуквы[ Сим ] = Неопределено);
Если НЕ флгЭтоБуква Тогда
// сброс буферов
Конец = Сч-1;
ИначеЕсли Сч = рСтоп Тогда
// это конец
Конец = Сч;
КонецЕсли;
КонецЕсли; // Если флгЭтоРазрвыв Тогда
// сброс буферов
Если НЕ Конец = Неопределено Тогда
Если НЕ Начало = Неопределено Тогда
// буфер
текДлина = Конец - Начало + 1;
Если текДлина > 0 Тогда
Слова.Добавить(
Новый Структура( "Начало,Конец,Длина,Слово",
Начало, Конец, текДлина, Сред(Текст, Начало, текДлина)
)
);
КонецЕсли;
КонецЕсли;
Начало = Неопределено;
Конец = Неопределено;
КонецЕсли; // Если НЕ Конец = Неопределено Тогда
Если Начало = Неопределено
И не флгЭтоРазрвыв
И не флгЭтоБуква Тогда
// если текущий символ - не буква, сбрасываем её
Слова.Добавить(
Новый Структура( "Начало,Конец,Длина,Слово",
Сч, Сч, 1, Сим
)
);
КонецЕсли;
КонецЦикла; // Для Сч = Старт по Стоп Цикл
Возврат Слова;
КонецФункции
// Ищет Массив в массиве
// ПрерватьПоискНаВхожденииНомер - 0-все, 1..n-количество вхождений
Функция масНайти(БольшойМассив, ИмяРеквизитаБольшого=Неопределено,
МалыйМассив, ИмяРеквизитаМалого=Неопределено,
ПрерватьПоискНаВхожденииНомер=1
)
Рез = Новый Массив;
Если БольшойМассив.Количество() < МалыйМассив.Количество() Тогда
Возврат Рез;
КонецЕсли;
Больших = БольшойМассив.Количество();
Малых = МалыйМассив.Количество();
Для ИндексБольшой = 0 по Больших - Малых Цикл
Найдено = Истина;
Для ИндексМалый = 0 по Малых-1 Цикл
ЭлементБ = БольшойМассив[ ИндексБольшой + ИндексМалый ];
ЭлементМ = МалыйМассив[ ИндексМалый ];
Если ИмяРеквизитаБольшого = Неопределено Тогда
ЗначениеБ = ЭлементБ;
Иначе
ЗначениеБ = ЭлементБ[ ИмяРеквизитаБольшого ];
КонецЕсли;
Если ИмяРеквизитаМалого = Неопределено Тогда
ЗначениеМ = ЭлементМ;
Иначе
ЗначениеМ = ЭлементМ[ ИмяРеквизитаМалого ];
КонецЕсли;
Найдено = ( ЗначениеБ = ЗначениеМ );
Если НЕ Найдено Тогда
Прервать;
КонецЕсли;
КонецЦикла; // Для ИндексМалый = 0 по Малых-1 Цикл
Если Найдено Тогда
Рез.Добавить( ИндексБольшой );
Если ПрерватьПоискНаВхожденииНомер <> 0
И Рез.Количество() = ПрерватьПоискНаВхожденииНомер Тогда
Прервать;
Иначе
// переносим
ИндексБольшой = ИндексБольшой + Малых - 1;
КонецЕсли;
КонецЕсли;
КонецЦикла; // Для ИндексБольшой = 0 по Больших - Малых Цикл
Возврат Рез;
КонецФункции
Функция стрНайтиНесущуюСтроку( Текст, Искомое, Старт=Неопределено, Стоп=Неопределено, ЧувствительностьКРегистру=Ложь, ПрерватьПоискНаВхожденииНомер=1)
Рез = Новый Массив;
Длина = СтрДлина(Текст);
рСтарт = ?( Старт = Неопределено, 1, Макс(1, Старт) );
рСтоп = ?( Стоп = Неопределено, Длина, Мин(Длина, Стоп) );
ДлинаПоля = (рСтоп - рСтарт + 1);
ДлинаИскомого = СтрДлина(Искомое);
Если ДлинаИскомого > ДлинаПоля Тогда
Возврат Рез;
КонецЕсли;
рТекст = ?( ЧувствительностьКРегистру, Текст, ВРег(Текст) );
рИскомое = ?( ЧувствительностьКРегистру, Искомое, ВРег(Искомое) );
масТекст = стрРазобратьПоСловам( рТекст, рСтарт, рСтоп );
масИскомое = стрРазобратьПоСловам( рИскомое );
ИскомыхСлов = масИскомое.Количество();
Найденное = масНайти( масТекст, "Слово", масИскомое, "Слово", ПрерватьПоискНаВхожденииНомер );
Для Каждого ОчереднаяПозиция из Найденное Цикл
ИндексПервого = ОчереднаяПозиция;
ИндексПоследнего = ИндексПервого + ИскомыхСлов - 1;
ПервоеСлово = масТекст[ ИндексПервого ];
ПоследнееСлово = масТекст[ ИндексПоследнего ];
НоваяЗапись = Новый Структура("Позиция,ПозицияПоследнего,Длина",
ПервоеСлово.Начало,
ПоследнееСлово.Конец,
ПоследнееСлово.Конец - ПервоеСлово.Начало + 1
);
Рез.Добавить( НоваяЗапись );
КонецЦикла;
Возврат Рез;
КонецФункции
Функция стрЗаменитьНесущуюСтроку(Текст, НесущаяСтрока, ТекстЗамены, ЧувствительностьКРегистру=Ложь)
Рез = "";
рСтарт = 1;
Длина = СтрДлина( Текст );
Позиции = стрНайтиНесущуюСтроку( Текст, НесущаяСтрока, рСтарт,, ЧувствительностьКРегистру, 0 );
Для Каждого Позиция из Позиции Цикл
Рез = Рез + Сред( Текст, рСтарт, Позиция.Позиция-рСтарт );
Рез = Рез + ТекстЗамены;
рСтарт = Позиция.ПозицияПоследнего + 1;
КонецЦикла; // Для Каждого Позиция из Позиции Цикл
Если НЕ рСтарт > Длина Тогда
Рез = Рез + Сред( Текст, рСтарт );
КонецЕсли;
Возврат Рез;
КонецФункции
Показать