Найти значение в строке

Добрый день, помогите пожалуйста, есть строка вида 355035|uin=18810150201111703544|TechCode=03|ruleId=18810150201111703544|quittDate=11.11.2020|
Разложил по разделители | в массив. Массив. Найти не помогает так как допустим мне нужно uin= но после равно каждый раз новое значение или же может быть под другим индексом. СтрНайти вообще не пойму как применить к данной строке, подскажите как быть?

12
Орфографическая ошибка в quittDate: quitt

Ответы

SDV
#1, 20 ноября 2020 23:12

если вы смогли получили массив, то почему бы не взять элемент массива с индексом 1, и сделать с ним нечто такое:
Результат = СтрЗаменить(МассивСлов[1], "uin=", "");

Ну это при условии, что местоположение реквизита uin всегда будет таким


Washington
#2, 20 ноября 2020 23:42

(1) SDV, в этом и дело что меняет, я же написал об этом, он может быть и 11 индексом и 2. Либо придётся под каждое условие делать, их более 5, но с точки зрения производительности думаю не корректно так будет. По этому думаю можно как то с массивом или со строкой поработать что бы получить требуемое значение.


SDV
#3, 20 ноября 2020 23:57

(2) Washington, при условии что имена реквизитов уникальны и совместимы с именами переменных 1С я бы преобразовал массив в структуру и с ним бы уже работал:

Структура = Новый Структура;

Для каждого ЭлементМассива из Массив Цикл
	ПозицияРазделителя = Найти(ЭлементМассива,"=");
	Ключ = Лев(ЭлементМассива, ПозицияРазделителя - 1);
	Значение = Сред(ЭлементМассива, ПозицияРазделителя + 1);
	Структура.Вставить(Ключ, Значение);
КонецЦикла


SDV
#4, ред. 21 ноября 2020 10:01

(2) Washington, ну или вот такие извращения:

Результат = Лев(Сред(Строка, Найти(Строка,"uin=") + 4), Найти(Сред(Строка, Найти(Строка,"uin=") + 4),"|")-1);


Aleks.spb
#5, ред. 21 ноября 2020 10:00

Функция ЗначениеUIN (Знач ВхДанные)
	
	Старт = СтрНайти(ВхДанные, "uin=");
	ВхДанные = Сред(ВхДанные, Старт +4);
	Финиш = СтрНайти(ВхДанные, "|");
	Возврат Сред(ВхДанные, 1, Финиш-1);
	
КонецФункции


Лучший ответ bolsun
#6, 21 ноября 2020 09:59

Вариант через регулярное выражение

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.MultiLine = Истина;
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;
RegExp.Pattern = "uin=(\d+)";

ПроверяемаяСтрока = "355035|uin=18810150201111703544|TechCode=03|ruleId=18810150201111703544|quittDate=11.11.2020|";

Matches=RegExp.Execute(ПроверяемаяСтрока);

Если Matches.Count > 0 Тогда
	SubMatch = Matches.Item(0);
	uin = SubMatch.SubMatches.Item(0);
	Сообщить("uin: " + uin);
КонецЕсли;


Washington
#7, 23 ноября 2020 14:38

(6) bolsun, Этот вариант намного лучше работает и быстрее и меньше кода . вот только вопрос , какое регулярное выражение , тоесть шаблон , что бы получить дату ? |quittDate=11.11.2020|


Washington
#8, 23 ноября 2020 14:54

(7) Washington, Спасибо , сам разобрался шаблон для даты (\d{2}(.|/)\d{2}(.|/)\d{4})


Danila
#9, ред. 14 декабря 2020 22:05

Функция ИзСтрокиВМассив(НачальнаяСтрока,Разделитель) Экспорт
	
	СтрокаПреобразованнаяВМногострочныйТекст     = СтрЗаменить(НачальнаяСтрока,Разделитель,Символы.ПС);
	ТекстовыйДокументИзСтроки                    = Новый ТекстовыйДокумент;
	Результат                                    = Новый СписокЗначений;
	ТекстовыйДокументИзСтроки.УстановитьТекст(СтрокаПреобразованнаяВМногострочныйТекст);
	Для СчетчикСтрок = 1 по ТекстовыйДокументИзСтроки.КоличествоСтрок() цикл
		Результат.Добавить(СокрЛП(ТекстовыйДокументИзСтроки.ПолучитьСтроку(СчетчикСтрок)));
	КонецЦикла;
	Возврат Результат;
	
КонецФункции

Из массива дергай че хочешь !

Второй вариант

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


Vudi
#10, 12 января 2021 16:53

Поместить массив в ТЗ, а затем искать через .Найти или .


Little Friend
#11, 01 февраля 2021 19:31

(6) bolsun, из пушки по воробьям. p.s. А если клиент на Linux?


bolsun
#12, 01 февраля 2021 20:01

(11) Little Friend, в техзадании про Linux ничего не сказано ))
а вообще написал же, что это один из вариантов.


См. также

НайтиСтрокуВДанныхФормыДерево (БСП)

НайтиСтрокиТаблицы (БСП)

Проверить наличие колонки в таблице значений, когда нет доступа к самой таблице и методу Найти у коллекции Колонки

НайтиДублиЭлемента (БСП)

НайтиЭлементСпискаЗначений (БСП)

Строковые функции. Альтернатива для СтрРазделить, СтрНайти и т.д.

ЗначениеВСтрокуXML (БСП)

ЗначениеИзСтрокиXML (БСП)

Описание строки в таблице значений

Модератору