Использование регулярных выражений

1. Seraf1no 23.06.17 13:55 Сейчас в теме
Господа, добрый день. Возникла следующая ситуация: необходимо построчно читать хтмл и искать артикулы в нем, в виде 1234/6452, т.е. по 4 цифры через слеш. Всегда делал стандартными средствами, типа Лев, прав и стрЗаменить, решил перейти на регулярные выражения, т.к. исходный хтмл очень кривой.
Не могу понять, что я делаю не так. Таблица значений не заполняется.
	
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Артикул");
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать("C:\Users\*****\Desktop\BT.htm");

    RegExp = Новый COMОбъект("VBScript.RegExp");
	
	RegExp.MultiLine = Истина;
	RegExp.Global = Истина;
	RegExp.IgnoreCase = Истина;
    RegExp.Pattern = "[0-9]{4}/[0-9]{4}";
        
    Совпадения = RegExp.Execute(Текст.ПолучитьТекст());

    Для Каждого Совпадение Из Совпадения Цикл
	
		НовСтр = ТЗ.Добавить();
        ЗаполнитьЗначенияСвойств(НовСтр.Артикул, Совпадение);
        
    КонецЦикла;


Показать


Если писать вместо
ЗаполнитьЗначенияСвойств(НовСтр.Артикул, Совпадение);
такое
НовСтр.Артикул = Совпадения;
, то понятное дело, что колонка Артикул принимает значения COMОбъект.
+
По теме из базы знаний
Найденные решения
2. Seraf1no 23.06.17 14:31 Сейчас в теме
Заработала следующая конструкция
	Сч = 0;
	Пока Совпадения.Count() > сч Цикл
		
		Match = Совпадения.Item(Сч);
		НовСтр = ТЗ.Добавить();
		НовСтр.Артикул = Match.Value;
		//Сообщить(Match.Value);
		Сч = Сч + 1;
		
	КонецЦикла;
Показать
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Seraf1no 23.06.17 14:31 Сейчас в теме
Заработала следующая конструкция
	Сч = 0;
	Пока Совпадения.Count() > сч Цикл
		
		Match = Совпадения.Item(Сч);
		НовСтр = ТЗ.Добавить();
		НовСтр.Артикул = Match.Value;
		//Сообщить(Match.Value);
		Сч = Сч + 1;
		
	КонецЦикла;
Показать
+
3. starik-2005 3036 23.06.17 14:36 Сейчас в теме
(2)
Пока Совпадения.Count() > сч Цикл
А что, "Для" уже не катит?
    Для А = 0 ПО Совпадения.Count()-1 Цикл
        
        ТЗ.Добавить().Артикул = Совпадения.Item(А).Value;
        
    КонецЦикла;
Считай, что одна строка кода )))
Seraf1no; akR00b; +2
4. boln 1040 23.06.17 22:45 Сейчас в теме
(3) А почему бы Совпадения.Count()-1 до цикла не получить?
+
5. starik-2005 3036 23.06.17 23:47 Сейчас в теме
(4)
А почему бы
А с какой целью?
+
6. boln 1040 24.06.17 08:13 Сейчас в теме
(5) А разве выражение не будет вычисляться на каждом проходе цикла?
+
7. starik-2005 3036 24.06.17 17:25 Сейчас в теме
(6) нет, оно уже однажды вычислилось и поместилось в массив "Совпадения":
Совпадения = RegExp.Execute(Текст.ПолучитьТекст());
+
8. boln 1040 24.06.17 17:46 Сейчас в теме
(7) Но цикл выполняется в коде 1С, а не в объекте RegExp. Компилятор 1С ничего не знает о том, что результат этого выражения не меняется, он видит вызов метода объекта и генерирует исполняемый код этого вызова. Поэтому я очень сильно подозреваю, что метод Count() будет вызываться и выражение Count()-1 будет вычисляться на каждом проходе цикла.
+
9. starik-2005 3036 24.06.17 21:40 Сейчас в теме
(8)
будет вычисляться на каждом проходе цикла
Это свойство объекта, оно уже хранится в памяти, поэтому вычисляться ему не нужно. При этом цикл в 1С запоминает значение, что легко проверяется следующим кодом:
Функция ПолучитьКоличество()
	Сообщить("Получем кол-во!");
	Возврат 10
КонецФункции

&НаКлиенте
Процедура Hey(Команда)
	а = 0;
	Для F = 0 ПО ПолучитьКоличество()-1 Цикл 
		а = а + 1;
	КонецЦикла;
	Сообщить(а);
КонецПроцедуры
Показать
Прикрепленные файлы:
boln; +1
10. boln 1040 24.06.17 22:25 Сейчас в теме
(9) Вы правы, выражение По вычисляется только один раз. В Синтакс-помощнике об этом тоже сказано. Спасибо, буду знать.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот