Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 апр 2024, 06:18

Регулярные выражения

Автор Crusader, 10 дек 2012, 10:40

0 Пользователей и 1 гость просматривают эту тему.

Crusader

Добрый день! Поступило такое задание: написать регулярное выражение, проверяющее заполнение наименования справочника контрагентов, то есть если заполнено: ООО "Рога и копыта" то это считается неправильным, а правильным будет "Рога и копыта" ООО. Использую для создания регулярного выражения объект RegExp = Новый COMОбъект("VBScript.RegExp"). Теперь непосредственно вопрос: концептуально регулярное выражение выглядит так: НЕ [список организационно-правовых форм] [любой текст] [список организационно-правовых форм], то есть в начале нужно проверять на "НЕ" список слов с наименованиями организационно-правовых форм "ООО", "ЗАО", "ИП" и тд, но лично у меня так и не получилось реализовать так чтобы работало с отрицанием списка слов. С проверкой на наличие списка слов проблем нет, а вот на то же самое только с отрицанием ничего не получается. Человек, часто рисующий регулярные выражения посоветовал реализовать в два регулярных выражения, то есть сначала одно проверяет на наличие наименования орг-правовой формы в начале строки и если его там нет идёт проверка на наличие этого наименования в конце строки и если оба условия верны, то заполнение считается правильным. Реализовал, работает, показал начальству, сказали сделать так чтоб использовалось одно рег. выражение.. В общем, нужно либо как-то железно обосновать что в одно реализовать не получится либо всё-таки как-то извратиться. Помогите кто чем может, заранее спасибо!

MuI_I_Ika

Цитата: Crusader от 10 дек 2012, 10:40сказали сделать так чтоб использовалось одно рег. выражение

Непонятно, они к конкретному коду придираются? Или это имеет отражение в объектах?

Вообще непонятно почему вы эту задачу реализуете через com объект. На мой взгляд, встроенного языка вполне достаточно. Тем более вы сами себя решаете кроссплатформенности.

Crusader

Цитата: MuI_I_Ika от 10 дек 2012, 12:22Непонятно, они к конкретному коду придираются? Или это имеет отражение в объектах?

Вообще непонятно почему вы эту задачу реализуете через com объект. На мой взгляд, встроенного языка вполне достаточно. Тем более вы сами себя решаете кроссплатформенности.

Нет, единственное требование к коду - это чтобы задача решалась с помощью одного регулярного выражения, хотя по мне гораздо проще было бы написать элементарную процедурку проверки первого и последнего слова в строке, но..."так некрасиво". А что касается объекта, это как я понял просто вопрос куда "зашивать" регэксп, и в общем-то это первое, что я нашёл в интернете и стал использовать чтобы тестировать регулярное выражение. Не знаю, может быть это принципиальный момент и у меня как раз поэтому не получается? Но моё внимание было сосредоточено на составлении самого выражения.

MuI_I_Ika

Может логичнее будет написать процедуру обработки на языке 1С, а регулярное выражение положить в виде текста в какой-нибудь реквизит. Как я понимаю вам нужно реализовать всего навсего функцию "не" и отбор по списку заданных значений.

Dethmontt

[^Знач]\A+\[Знач]\$
Что то типа этого?
Добавлено: 10 дек 2012, 12:52


Цитата: Crusader от 10 дек 2012, 10:40Человек, часто рисующий регулярные выражения
неужели вам не может помочь этот человек?
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Crusader

Цитата: MuI_I_Ika от 10 дек 2012, 12:49Может логичнее будет написать процедуру обработки на языке 1С, а регулярное выражение положить в виде текста в какой-нибудь реквизит. Как я понимаю вам нужно реализовать всего навсего функцию "не" и отбор по списку заданных значений.

А можно поподробнее? Если регулярное выражение положить в виде текста в реквизит, то как им пользоваться? Вот у используемого мной объекта есть метод Test(), который осуществляет проверку текста, указанного в качестве параметра, на соответствие регулярному выражению, а там как действовать? Кроме того само выражение с отрицанием как я уже говорил работать не хочет, то есть вот что есть: ^((ЗАО)|(ООО)|(ИП)|(ОАО))\s+\S+?.*?\s*$ - это проверка на наличие, она работает, но если пытаться лепить в список ((ЗАО)|(ООО)|(ИП)|(ОАО)) отрицание, например [^((ЗАО)|(ООО)|(ИП)|(ОАО))] то ничего не получается, проверка работает вообще непойми как.
Добавлено: 10 дек 2012, 14:33


Цитата: Dethmontt от 10 дек 2012, 12:51[^Знач]\A+\[Знач]\$
Что то типа этого?

Да, что-то типа этого :) Вот что мы осилили с этим человеком: ^((ЗАО)|(ООО)|(ИП)|(ОАО))\s+\S+?.*?\s*$ - это проверка на наличие, она работает, а вот отрицание не работает..

Dethmontt

Выложите сюда код вышей процедуры с выражением.
А то писать самому не охота...
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Crusader

Работающий вариант у меня только с двумя регулярными выражениями:
   
RegExp1 = Новый COMОбъект("VBScript.RegExp");
RegExp1.MultiLine = ЛОжь;
RegExp1.Global = Истина;
RegExp1.IgnoreCase = Истина;

RegExp2 = Новый COMОбъект("VBScript.RegExp");
RegExp2.MultiLine = ЛОжь;
RegExp2.Global = Истина;
RegExp2.IgnoreCase = Истина;

Шаблон1 = "^((ЗАО)|(ООО)|(ИП)|(ОАО))\s+\S+?.*?\s*$";
Шаблон2 = "^\s*\S+?.*?\s+((ЗАО)|(ООО)|(ИП)|(ОАО))\s*$";

RegExp1.Pattern = Шаблон1;
RegExp2.Pattern = Шаблон2;

Если НЕ RegExp1.Test(Текст) Тогда   
   Если RegExp2.Test(Текст) ТОгда
      Сообщить("ВВод правильный");
      Иначе  Сообщить("Ввод неправильный");   
   КонецЕсли;
Иначе   
Сообщить("Ввод неправильный");
КонецЕсли;

Dethmontt

Процедура КнопкаВыполнитьНажатие(Кнопка)
    СтрокаВыражения = "ЗАО,ООО,ИП,ОАО";
Наименование = "ООО Рога и копыта ООО";
    Масс = РазбитиеСтрокТелефон(Наименование,СтрокаВыражения);
Если Не Масс Тогда
Сообщить("Наименование введено не корректно = "+Наименование);
КонецЕсли;
   
КонецПроцедуры

Функция РазбитиеСтрокТелефон(Знач стр,Знач СтрВыражение)

СостряпатьСтрокуВыражение(СтрВыражение);

    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.IgnoreCase = Истина; //Игнорировать регистр
    RegExp.Global = Истина; //Поиск всех вхождений шаблона
    RegExp.MultiLine = Ложь; //Многострочный режим   

СтрВыражение = "^[^"+СтрВыражение+"]\W+("+СтрВыражение+")$";

    RegExp.Pattern = СтрВыражение;
Matches=RegExp.Execute(стр);
ЧислоВхождений = Matches.Count();
Если ЧислоВхождений > 0 тогда 
для кол = 0 по ЧислоВхождений - 1 цикл
Возврат Истина;
КонецЦикла;
КонецЕсли;

Возврат Ложь;
   
КонецФункции

Процедура СостряпатьСтрокуВыражение(Строка)

ГотоваяСтрока = "";
НачПоз = Найти(Строка,",");
Пока НачПоз > 0 Цикл
ГотоваяСтрока = ГотоваяСтрока+?(ПустаяСтрока(ГотоваяСтрока),Сред(Строка,1,НачПоз-1),"|"+Сред(Строка,1,НачПоз-1));
Строка = Сред(Строка,НачПоз+1);
НачПоз = Найти(Строка,",");
КонецЦикла;

ГотоваяСтрока = ГотоваяСтрока+?(ПустаяСтрока(ГотоваяСтрока),Строка,"|"+Строка);
Строка = ГотоваяСтрока;

КонецПроцедуры

Добавлено: 10 дек 2012, 16:21


Я на коленке накидал... Принцип такой: Если в начале строки попадается СтрокаВыражения (ее можешь хранить например в регистре сведений или в макете) и считывать при запуске обработки то строка считается некорректной, если в конце строки отсутствует СтрокаВыыражения тогда строка считается некорректной

Я не учел пробелы...
Пробелы сам допишешь...
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Crusader

Не хочет работать, всё время возвращает Ложь...и дело судя по всему не в пробелах.  СтрВыражение = "^[^"+СтрВыражение+"]\W+("+СтрВыражение+")$" - ты уверен что так можно передавать параметр СтрВыражение в регулярное выражение? Я для эксперимента пробовал просто вот так: СтрокаВыражение = "^[^"+СтрВыражение+"]$" и забивал что-то неравное "зао","ооо", и тд, но проверка выражения всё равно всё время возвращает Ложь, пробовал без отрицания ["+СтрВыражение+"], вбивал "зао", но всё равно возвращает Ложь. И ещё я не очень понимаю зачем использовать метод Execute() если есть метод Test()? Если предположить, что наше регулярное выражение СтрВыражение = "^[^"+СтрВыражение+"]\W+("+СтрВыражение+")$" воспринимается объектом корректно, то по идее метод Test() должен прекрасно работать и сразу выдавать результат соответствия строки выражению.

Теги:

Похожие темы (4)

Рейтинг@Mail.ru

Поиск