Поиск и замена строк без учета пробелов, переносов строк и табуляций

Администрирование - Поиск данных

Поиск и замена строк игнорируя пробелы, переносы строк и табуляции. Обработка тестировалась на самописной конфигурации под Управляемыми формами, при режиме совместимости "Версия 8.3.6".

Функция находит в тексте подстроку игнорируя пробелы, переносы строк и табуляции.
Будет полезна при замене подстрок в тексте запроса тем, кто по различным причинам не использует регулярные выражения.

Например, функция находит строку «искомый текст» в тексте
«тут
    где-то    
        должен быть
            (искомый
                текст
)
»

Обработка-пример прилагается (управляемые формы).

Скачать файлы

Наименование Файл Версия Размер
Поиск и замена строк без учета пробелов, переносов строк и табуляций:
.epf 13,43Kb
10.09.17
1
.epf 13,43Kb 1 Скачать

См. также

Комментарии
1. Max Kir (mismak) 2 10.09.17 18:26 Сейчас в теме
Функция стрНайтиНесущуюСтроку ищет подстроку в строке,
функция стрЗаменитьНесущуюСтроку заменяет подстроку на заданную строку

Код:
Функция стрРазобратьПоСловам(Текст, Старт=Неопределено, Стоп=Неопределено)
	
	Длина	=	СтрДлина(Текст);
	
	рСтарт	=	?( Старт	=	Неопределено, 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;
		
	КонецЦикла;	//	Для Каждого Позиция из Позиции Цикл 
	
	Если НЕ рСтарт	>	Длина Тогда 
		Рез	=	Рез	+	Сред( Текст, рСтарт );
	КонецЕсли;
		
		
	Возврат Рез;
	
КонецФункции

Показать
Оставьте свое сообщение