Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
17 Дек 2017, 22:46
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Регулярные выражения  (Прочитано 8084 раз)

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

Оффлайн Crusader

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


Оффлайн MuI_I_Ika

  • Гончаров Михаил
  • Администратор
  • *****
  • Сообщений: 6558
  • РЕПУТАЦИЯ: 775
  • КПД: 12%
  • Регистрация: 2012-08-15
    • Skype: MuI_I_Ika
  • Сайт: 
  • Профессия: Программист 1С
сказали сделать так чтоб использовалось одно рег. выражение

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

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

Оффлайн Crusader

  • *
  • Сообщений: 10
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2012-12-10
  • Сайт: 
  • Профессия: Программист 8.1
Непонятно, они к конкретному коду придираются? Или это имеет отражение в объектах?

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

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

Оффлайн MuI_I_Ika

  • Гончаров Михаил
  • Администратор
  • *****
  • Сообщений: 6558
  • РЕПУТАЦИЯ: 775
  • КПД: 12%
  • Регистрация: 2012-08-15
    • Skype: MuI_I_Ika
  • Сайт: 
  • Профессия: Программист 1С
Может логичнее будет написать процедуру обработки на языке 1С, а регулярное выражение положить в виде текста в какой-нибудь реквизит. Как я понимаю вам нужно реализовать всего навсего функцию "не" и отбор по списку заданных значений.

Оффлайн Dethmontt

  • Денис
  • Модератор
  • *****
  • Сообщений: 2857
  • РЕПУТАЦИЯ: 546
  • КПД: 19%
  • Адын Эс
  • Регистрация: 2010-11-01
  • Сайт: 
  • Профессия: Программист 1С
[^Знач]\A+\[Знач]\$
Что то типа этого?
Добавлено: 10 Дек 2012, 12:52

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

Оффлайн Crusader

  • *
  • Сообщений: 10
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2012-12-10
  • Сайт: 
  • Профессия: Программист 8.1
Может логичнее будет написать процедуру обработки на языке 1С, а регулярное выражение положить в виде текста в какой-нибудь реквизит. Как я понимаю вам нужно реализовать всего навсего функцию "не" и отбор по списку заданных значений.

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

[^Знач]\A+\[Знач]\$
Что то типа этого?

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

Последний раз редактировалось: Crusader; 10 Дек 2012, 14:33

Оффлайн Dethmontt

  • Денис
  • Модератор
  • *****
  • Сообщений: 2857
  • РЕПУТАЦИЯ: 546
  • КПД: 19%
  • Адын Эс
  • Регистрация: 2010-11-01
  • Сайт: 
  • Профессия: Программист 1С
Выложите сюда код вышей процедуры с выражением.
А то писать самому не охота...
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Оффлайн Crusader

  • *
  • Сообщений: 10
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2012-12-10
  • Сайт: 
  • Профессия: Программист 8.1
Работающий вариант у меня только с двумя регулярными выражениями:
   
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

  • Денис
  • Модератор
  • *****
  • Сообщений: 2857
  • РЕПУТАЦИЯ: 546
  • КПД: 19%
  • Адын Эс
  • Регистрация: 2010-11-01
  • Сайт: 
  • Профессия: Программист 1С
Процедура КнопкаВыполнитьНажатие(Кнопка)
    СтрокаВыражения = "ЗАО,ООО,ИП,ОАО";
Наименование = "ООО Рога и копыта ООО";
    Масс = РазбитиеСтрокТелефон(Наименование,СтрокаВыражения);
Если Не Масс Тогда
Сообщить("Наименование введено не корректно = "+Наименование);
КонецЕсли;
   
КонецПроцедуры

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

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

    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

  • *
  • Сообщений: 10
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2012-12-10
  • Сайт: 
  • Профессия: Программист 8.1
Не хочет работать, всё время возвращает Ложь...и дело судя по всему не в пробелах.  СтрВыражение = "^[^"+СтрВыражение+"]\W+("+СтрВыражение+")$" - ты уверен что так можно передавать параметр СтрВыражение в регулярное выражение? Я для эксперимента пробовал просто вот так: СтрокаВыражение = "^[^"+СтрВыражение+"]$" и забивал что-то неравное "зао","ооо", и тд, но проверка выражения всё равно всё время возвращает Ложь, пробовал без отрицания ["+СтрВыражение+"], вбивал "зао", но всё равно возвращает Ложь. И ещё я не очень понимаю зачем использовать метод Execute() если есть метод Test()? Если предположить, что наше регулярное выражение СтрВыражение = "^[^"+СтрВыражение+"]\W+("+СтрВыражение+")$" воспринимается объектом корректно, то по идее метод Test() должен прекрасно работать и сразу выдавать результат соответствия строки выражению.
 


Теги:
 


* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
145 Сообщений
AIFrame
64 Сообщений
ilyay ilyay
63 Сообщений
alex0402
50 Сообщений
andron81_81
44 Сообщений
oleg-x
42 Сообщений
BuhRust
32 Сообщений
MuI_I_Ika MuI_I_Ika
31 Сообщений
Golickoff Golickoff
28 Сообщений
alexandr_ll
24 Сообщений

* Кто онлайн

  • Точка Гостей: 287
  • Точка Скрытых: 0
  • Точка Пользователей: 6
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal