Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Регулярка, найти слово, опережающие и ретроспективные проверки

Регулярка, найти слово, опережающие и ретроспективные проверки
Я
   vladnet
 
11.12.20 - 00:36
Есть текст:

Маша> ела Кашу Маша <Машаша> <> Маша

Есть регулярка:

(?<![\wа-яА-Я])Маша(?![\wа-яА-Я])

Разбор регулярки, говорим что перед словом Маша не должно быть букв и цифр, и после не должно быть.
Все работает замечательно на https://regex101.com/

Но когда в 1с пользуюсь VBScript.RegExp валится с ошибкой, причем валится на первую часть (?<![\wа-яА-Я])
Нужно выбрать именно слово без того что сначала, чтобы после можно было также регуляркой просто заменить.

Что делать? Есть ли другой путь, может другую компоненту взять.
   МихаилМ
 
1 - 11.12.20 - 02:27
модераторы, перенесите тему  из 1с 1с8  в IT   "как страшно жить"

тк к 1с8 тема не имеет ни какого отношения, кроме убогого мироощущения тс
   МихаилМ
 
2 - 11.12.20 - 02:47
+(0) иоли секция "it"  "математика и алгоритмы"
   Дык ё
 
3 - 11.12.20 - 08:45
(0) а если [^\wа-яА-Я]Маша[^\wа-яА-Я]
   Ненавижу 1С
 
4 - 11.12.20 - 08:48
у каждой библиотеки свой диалект регулярки
   polosov
 
5 - 11.12.20 - 09:09
(0) (^|\s*)Маша(\s*|$)
   polosov
 
6 - 11.12.20 - 09:47
Или как-то так 
([^А-Яа-яA-Za-z0-9-])Маша([^А-Яа-яA-Za-z0-9-])
   Кирпич
 
7 - 11.12.20 - 09:58
(6) 'Ёё' еще добавить на всякий случай
   polosov
 
8 - 11.12.20 - 10:04
(7) Да, совершенно верно.
   TormozIT
 
9 - 11.12.20 - 10:18
(0) VBScript реализация не поддерживает просмотр вперед назад без поглощения. Поэтому смириться, либо юзать ВК с инфорстарта, которые все работают медленнее и глючнее, но зато поддерживают эту фичу.
   Ненавижу 1С
 
10 - 11.12.20 - 10:34
(7) ^(\W|\d) - буквенный символ
    \p{L} - аналогично

но все сильно от диалекта зависит
   vladnet
 
11 - 11.12.20 - 10:42
Понял спасибо всем. Остановился на варианте ([^\wА-Яа-я0-9ёЁ]|^)Маша(?![\wа-яА-ЯёЁ])
Сделал начало как здесь (6), только добавил начало строки иначе почему то слова в начале отсекало. Добавил ё как (7), действительно ё как букву не искало.
Буду видимо смотреть за длиной и если длина больше чем длина поисковой строки, то буду менять слово с позиции + 1.

Странно что 1с уже и работу с математикой и двоичными данными сделал, а компоненту работы с регулярными выражениями не добавят.
   vladnet
 
12 - 11.12.20 - 10:48
(9) Так и думал, спасибо что подтвердил мои подозрения.
(10) а куда это засунуть? Наверное уже лучше не будет, текущего варианта.
   vi0
 
13 - 11.12.20 - 10:52
(0) а что за прикладная задача? без регулярок не решить?
   Вафель
 
14 - 11.12.20 - 10:55
но задача найти слово - это же самая элементарная задача
   vi0
 
15 - 11.12.20 - 10:59
(14) хз, \bМаша\b не работает в 1с
   Конструктор1С
 
16 - 11.12.20 - 11:01
Вот вы такие красавцы вкорячиваете регулярки в 1с, а следующие программисты потом страдай. Занимательные головоломки им обеспечены
   Конструктор1С
 
17 - 11.12.20 - 11:02
Хуже регулярных выражений код запутывает разве что обфускация
   vi0
 
18 - 11.12.20 - 11:04
(17) ну если задача требует регулярки, то аналогичный код на 1с будет не намного читабельнее
   Конструктор1С
 
19 - 11.12.20 - 11:08
(18) это понятно. Но иногда можно пересмотреть задачу и вообще отказаться от регулярок
   Вафель
 
20 - 11.12.20 - 11:08
(19) AST парсер наше все
   Кирпич
 
21 - 11.12.20 - 11:09
(17) Регулярки и придумали для того, чтобы код не запутывать.
   Кирпич
 
22 - 11.12.20 - 11:11
(19) А можно почитать в википедии, что такое регулярки и пользоваться на здоровье.
   vi0
 
23 - 11.12.20 - 11:13
(20) можно поподробнее?
   Конструктор1С
 
24 - 11.12.20 - 11:22
(21) регулярки для гибкого поиска по тексту. А код они запутывают мама не горюй
   SiAl-chel
 
25 - 11.12.20 - 11:28
(24) Нет, не запутывают. Их просто надо понять и запомнить, как таблицу умножения.
   Кирпич
 
26 - 11.12.20 - 11:31
(24) регулярки придумали, чтобы делать поиск по тексту не запутывая код.
   vladnet
 
27 - 11.12.20 - 11:36
Задача простая - поиск и замена. Поддержка слова целиком. Подумал что так правильнее будет делать. Хотя сейчас понимаю что задачу я бы уже сделал если бы без этого делал.
   vi0
 
28 - 11.12.20 - 11:37
(24) я думаю что дело как всегда в конкретном программисте
если он "вкорячивает" где не нужно то это проблема, а если позаботится о коллегах и оформит код то..
можно и на 1с написать так что не поймешь, что и бывает
   vladnet
 
29 - 11.12.20 - 11:38
Наверное так и оставлю поиск через регулярку, потому что искать через СтрНайти и обрабатывать концы, выглядит корявее.
   vladnet
 
30 - 11.12.20 - 11:40
(24)(28) Поддержу, регулярки это всего лишь инструмент. Если пользоваться с умом, то в плюс.
 
 
   Конструктор1С
 
31 - 11.12.20 - 12:18
(25) сильно запутывают. Регулярное выражение из 30 символов ты будешь долго зачитывать-перечитывать, прежде чем поймешь его логику
   Кирпич
 
32 - 11.12.20 - 12:34
(31) Так то не код запутанный, а регулярное выражение запутанное. Код то тут при чем.
Регулярка из 30 символов может заменить код на два экрана. Проще прочитать 30 символов или два экрана?
Просто надо понимать регулярки и всё. 99% программистов их более менее понимают.
   Конструктор1С
 
33 - 11.12.20 - 12:47
(32) а регулярное выражение это не часть кода?

"Регулярка из 30 символов может заменить код на два экрана. Проще прочитать 30 символов или два экрана?"

Прочитать <> понять. 30 символов ты прочитаешь за секунды, а вот на расшифровку этого регулярного выражения у тебя может уйти времени больше, чем на чтение двух экранов кода.

"Просто надо понимать регулярки и всё. 99% программистов их более менее понимают"

ну ок. Что делает вот это регулярное выражение?

[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$
   vi0
 
34 - 11.12.20 - 12:48
   vi0
 
35 - 11.12.20 - 12:50
(33) на контекст бы взглянуть сначала
ну и можно инструменты использовать для отладки и визуализации https://www.debuggex.com/
   vi0
 
36 - 11.12.20 - 12:52
(33) [@], [.] - зачем скобки там?
   Ненавижу 1С
 
37 - 11.12.20 - 12:53
(33) проверяет валидность e-mail
   vi0
 
38 - 11.12.20 - 12:55
(36) а понятно, экранирование такое
   leonidkorolev
 
39 - 11.12.20 - 12:58
Комментарии к регуляркам никто же не отменял. Бывает и с кодом без комментов долго разбираешся
   Конструктор1С
 
40 - 11.12.20 - 13:01
(36) вот видишь, хренота нечитаемая. Так это ещё простой пример. Представь что будет, если одно регулярное выражение будет поставщиком данных для второго, а то для третьего?
   vi0
 
41 - 11.12.20 - 13:09
(40) на самом деле легко читаемая там есть избыточность:
вместо [@] можно просто написать @
вместо [.] можно написать \. - это стандартное экранирование, но программист решил в скобки загнать
ну если регулярки знать то вполне читаемо
   polosov
 
42 - 11.12.20 - 13:13
(40) Тоже так думал несколько лет назад. Теперь если надо что-то извлечь из текста, то первым делом регулярки использую.
   vi0
 
43 - 11.12.20 - 13:15
(40) в нормальных диалектах можно одно выражение написать в нескольких строках с отступами и комментариями
например см здесь внизу страницы https://sekrasoft.livejournal.com/60316.html
   vi0
 
44 - 11.12.20 - 13:17
(43) +
console.log(createRegExp(function(){/*
  /
      \s+               -- непустая последовательность пробельных символов (пробелы, переносы строки)
    |                   -- или
      - -               -- строки, начинающиеся на "--"
      .*?               -- содержащие некоторое количество символов
      (
          (?= \*\/ )    -- и заканчивающиеся либо символом закрытия комментария JS...
                        --   важно не удалить закрытие комментария JS вместе с комментарием регулярного выражения
                        --   иначе второе регулярное выражение из createRegExp не будет соответствовать строке
                        --   (поэтому и используется ?=, чтобы комментарий не захватывался)
        |               -- ...или
          $             -- концом строки
      )
  /
  g                     -- причём, замена по этому регулярному выражению будет выполнена несколько раз,
  m                     -- а $ символизирует конец подстроки
   Timon1405
 
45 - 11.12.20 - 13:24
с регулярками есть очень тонкий момент: (цитата из Фридла) РВ должно совпадать там где должно и не совпадать там где не должно. к сожалению, многие наспех написанные РВ не попадают под вторую часть цитаты и при новых входных данных происходят неожиданные вещи. сложность в том, что новые входные данные могут прилететь не сразу, а через полгода и хорошо если вам, а не вашему сменщику. а времени сразу написать правильное выражение продумав бОльшую часть вариантов как правило нет. что далеко ходить, еЁ в этой теме всплыли не сразу.
   Конструктор1С
 
46 - 11.12.20 - 13:27
(42) не убедительно. Вася Пупкин "когда надо" пишет говнокод. Но говнокод от этого хорошим не становится
   polosov
 
47 - 11.12.20 - 13:52
(46) А я и не убеждаю. Я пишу как было у меня. РВ это инструмент, который удобно использовать для работы с парсингом строк. Маленькое короткое выражение может заменить простыню кода на языке, на котором ты пишешь. Но если ты не умеешь этим инструментом пользоваться, то твое дело изучать его или писать парсинг на языке, который знаешь.
   Кирпич
 
48 - 11.12.20 - 13:53
(33) ну так ты напиши в комментарии, что оно делает и все дела.
Для полноты картины, напиши то же самое, что делает твоя регулярка, на языке 1с.
   Кирпич
 
49 - 11.12.20 - 14:00
+(48) да еще чтобы можно было потом этот код легко подправить. В регулярке ты три буквы поменяешь и готово, а в коде нужно понять как что и где менять. Регулярку ты можешь в любой момент проверить и отладить на https://regex101.com, а писанину твою проще выкинуть и заново написать, ибо все пишут по разному.
   vi0
 
50 - 11.12.20 - 14:11
(45) а что Фридл говорит о наспех написанном собственном парсинге при новых входных данных?)
   Конструктор1С
 
51 - 11.12.20 - 14:22
(49) тот, кто пишет угрёбищный нечитаемый код, напишет ещё куда более угрёбищные и менее читаемые регулярные выражения

"Регулярку ты можешь в любой момент проверить и отладить на"

Ты себя-то послушай. Допустим, разбираю я некий код, написанный другим программистом. Где-то в недрах этого кода обрабатывается текст, с ошибками. Наткнулся я на регулярку... ухожу на сайт, отлаживаю в течении получасика и потом убеждаюсь, что это вообще не та регулярка. В то время как нормальный код мог именами переменных и методов рассказать, что же он тут вообще делает. Если для выяснения логики кода нужно лазить с отладчиком, то это хреновый код
   Кирпич
 
52 - 11.12.20 - 14:25
(51) ну тогда всё. регулярки говно. нужно их придумать обратно.
   Конструктор1С
 
53 - 11.12.20 - 14:29
(52) регулярки, как и многие специфические возможности, нужно использовать очень осторожно и как можно реже. Если есть возможность обойтись без регулярок, то лучше обойтись. То же самое выражение из (33) легко проверилось бы обычным кодом в несколько строк
   polosov
 
54 - 11.12.20 - 14:30
(51) А если ты нашел, что подключаемая библиотека плохо работает?
   Кирпич
 
55 - 11.12.20 - 14:34
(52) в (33) наивная проверка, она сломается через 50 адресов. Да и такую задолбаешься писать на 1с.

//легко проверилось бы обычным кодом в несколько строк
чота ты не написал, а регулярку написал
   Кирпич
 
56 - 11.12.20 - 14:39
говорят такое правильно проверяет email :)     
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
   Timon1405
 
57 - 11.12.20 - 14:46
(50) он них никуда не даться, у него посыл что нужно посидеть и вдумчиво подумать чтобы учесть максимум Первоначальных вариантов).
пример, парсинг даты. даже отбросив в сторону разные форматы разделителей и американцев со своими перевернутыми датами и тупо написав "\d\d\.\d\d\.\d\d\d\d" получим совпадение на 35.декабря, хотя не должны(2я часть цитаты) . значит шаг первый: ограничить день до 31, шаг второй: 31 апреля быть не может, шаг третий 29 февраля тоже не всегда итд., это бесконечно. в общем, идеала не будет но к нему нужно стремиться)
   Конструктор1С
 
58 - 11.12.20 - 14:54
(55) не задолбаешься. Ушло целых 10 минут
Функция ЕмейлПравильный(Адрес)        
    
    Если Не ТолькоДопустимыеСимволы(Адрес) Тогда
        Возврат Ложь;
    КонецЕсли;
    
    Если СтрЧислоВхождений(Адрес, "@") <> 1 Тогда
        Возврат Ложь;    
    КонецЕсли;

    Домен = СтрРазделить(Адрес, "@")[1];
    
    Если СтрЧислоВхождений(Домен, ".") = 0 Тогда
        Возврат Ложь;    
    КонецЕсли;    
        
    Если Не ТолькоДопустимыеСимволы(Домен) Тогда
        Возврат Ложь;
    КонецЕсли; 
    
    Возврат Истина;    

КонецФункции// ЕмейлПравильный()


Функция ТолькоДопустимыеСимволы(Знач Строка)

    ДопустимыеСимволы = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-.@";
    
    Для Инд = 1 По СтрДлина(Строка) Цикл
         Символ = Сред(Строка, Инд, 1);
        Если СтрЧислоВхождений(ДопустимыеСимволы, ВРег(Символ)) = 0 Тогда
            Возврат Ложь;        
        КонецЕсли;    
    КонецЦикла;
    
    Возврат Истина;

КонецФункции// ТолькоДопустимыеСимволы()
   polosov
 
59 - 11.12.20 - 14:58
(58) А теперь используй свой код для того, чтобы выдернуть из 10МБ текста, все адреса.
   Конструктор1С
 
60 - 11.12.20 - 14:59
(59) так и (33) не выделит
 
 
   Конструктор1С
 
61 - 11.12.20 - 15:02
+(60) но если очень уж понадобилось бы, достаточно добавить ешё пару функций
   polosov
 
62 - 11.12.20 - 15:03
(60) Выделит.
   polosov
 
63 - 11.12.20 - 15:08
5 строчек против 50-100
   polosov
 
64 - 11.12.20 - 15:08
(63) к (61)
   _DAle_
 
65 - 11.12.20 - 15:10
(58) Этот код же не эквивалентен регэкспу, еще много дописать нужно.
   Конструктор1С
 
66 - 11.12.20 - 15:17
(63) тебя задевает количество строчек? Сможешь доработать вот такой код:

Функция ПадежС(z1,Знач z2=2,Знач z3="*",z4=0) Экспорт
    z5=Найти(z1,"-"); z6=?(z5=0,"","-"+ПадежС(Сред(z1,z5+1,СтрДлина(z1)-z5+1),z2,z3,z4)); z1=НРег(?(z5=0,z1,Лев(z1,z5-1))); z7=Прав(z1,3);z8=Прав(z7,2);z9=Прав(z8,1);
    z5=СтрДлина(z1); za=Найти("ая ия ел ок яц ий па да ца ша ба та га ка",z8); zb=Найти("аеёийоуэюяжнгхкчшщ",Лев(z7,1)); zc=Макс(z2,-z2); zd=?(za=4,5,Найти("айяь",z9));
    zd=?((zc=1)или(z9=".")или((z4=2)и(Найти("оиеу"+?(z3="ч","","бвгджзклмнпрстфхцчшщъ"),z9)>0))или((z4=1)и(Найти("мия мяэ лия кия жая лея",z7)>0)),9,?((zd=4)и(z3="ч"),2,?(z4=1,?(Найти("оеиую",z9)+Найти("их ых аа еа ёа иа оа уа ыа эа юа яа",z8)>0,9,?(z3<>"ч",?(za=1,7,?(z9="а",?(za>18,1,6),9)),?(((Найти("ой ый",z8)>0)и(z5>4)и(Прав(z1,4)<>"опой"))или((zb>10)и(za=16)),8,zd))),zd)));
    ze=Найти("лец вей бей дец пец мец нец рец вец аец иец ыец бер",z7);
    zf=?((zd=8)и(zc<>5),?((zb>15)или(Найти("жий ний",z7)>0),"е","о"),?(z1="лев","ьв",?((Найти("аеёийоуэюя",Сред(z1,z5-3 ,1))=0)и((zb>11)или(zb=0))и(ze<>45),"",?(za=7,"л",?(za=10,"к",?(za=13,"йц",?(ze=0,"",?(ze<12,"ь"+?(ze=1,"ц",""),?(ze<37,"ц",?(ze<49,"йц","р"))))))))));
    zf=?((zd=9)или((z4=3)и(z3="ы")),z1,Лев(z1,z5-?((zd>6)или(zf<>""),2,?(zd>0,1,0)))+zf+СокрП(Сред("а у а "+Сред("оыые",Найти("внч",z9)+1,1)+"ме "+?(Найти("гжкхш",Лев(z8,1))>0,"и","ы")+" е у ойе я ю я ем"+?(za=16,"и","е")+" и е ю ейе и и ь ьюи и и ю ейи ойойу ойойойойуюойойгомуго"+?((zf="е")или(za=16)или((zb>12)и(zb<16)),"и","ы")+"мм",10*zd+2*zc-3,2)));
Возврат ?(""=z1,"",?(z4>0,ВРег(Лев(zf,1))+?((z2<0)и(z4>1),".",Сред(zf,2)),zf)+z6);
КонецФункции

автор постарался сэкономить на строках кода
   Йохохо
 
67 - 11.12.20 - 15:19
(62) .info
   Конструктор1С
 
68 - 11.12.20 - 15:20
+(66) всего-то 6 строчек кода. Только вот код абсолютно нечитаемый. В то время как 1000 строк кода может быть легко читаемыми
   Dedal
 
69 - 11.12.20 - 15:26
(57) Вот пожалуйста: ^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

Кто не может в РВ то не программист, а обычный эникейщик.
   Конструктор1С
 
70 - 11.12.20 - 15:28
(65) да, ещё нужно дописывать. Но заметь, ты быстро понял логику этого кода, и у тебя родилось понимание неполноценности кода. В то время как попробуй-ка при чтении (56) понять, что вообще делает эта строка
   polosov
 
71 - 11.12.20 - 15:29
(67) Одну циферку поменять и будет info
   polosov
 
72 - 11.12.20 - 15:31
(70) Ну так-то можно и язык запросов не учить и объектно вытаскивать данные. Код тоже будет читаемым.
   _DAle_
 
73 - 11.12.20 - 15:32
(70) Ну, мне лично тот регэксп, хоть он и какой-то кривой, было понять проще, чем код. В коде сложнее сразу словить ограничения на входную строку. Я согласен, что регэкспы часто пихают туда, куда не нужно, но пример с e-mail'ом - это не тот случай, как мне кажется.
   Йохохо
 
74 - 11.12.20 - 15:33
(71) 1@1.info.
   vi0
 
75 - 11.12.20 - 15:38
вот статья которую рекомендуют многие https://habr.com/ru/post/349860/
про (56) автор статьи говорит следующее: не надо так делать!!!
и называет ее write-only
   Кирпич
 
76 - 11.12.20 - 15:40
(70)//понять, что вообще делает эта строка

эта строка будет в функции  ЕмейлПравильный(Адрес)   
догадаться можно, если не тупой конечно
   polosov
 
77 - 11.12.20 - 15:42
(74) Тоже небольшая переделка.
   Timon1405
 
78 - 11.12.20 - 15:45
(69) 11.22.1963 - даже сериал такой есть. а теперь поправьте копипасту для учета американского формата дат
   Конструктор1С
 
79 - 11.12.20 - 15:46
(76) хорошо если так. Но многие 1сники не заморачиваются на выделение функций в несколько строк. С вероятностю 70% сие творение окажется где-нибудь в недрах портяночного метода на тыщу строк
   Кирпич
 
80 - 11.12.20 - 15:47
Функция ЕмейлПравильный(Адрес) 
    возврат re.Match("[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$",Адрес);
КонецФункции

вроде всё понятно
   Конструктор1С
 
81 - 11.12.20 - 15:50
(80) так понятно. А если "сие творение окажется где-нибудь в недрах портяночного метода на тыщу строк" будет нифига не понятно
   polosov
 
82 - 11.12.20 - 15:51
(81) Тогда учи регулярки, ничего не поделаешь.
   Кирпич
 
83 - 11.12.20 - 15:52
(81) Твое творение тоже можно засунуть в недра портяночного метода на тыщу строк
   Конструктор1С
 
84 - 11.12.20 - 16:11
(82) я с ними худо-бедно знаком. Но от этого понятными и очевидными они не становятся. Видишь ли в чём дело. Например, увидел ты строчку кода:

НужноВыгружать = КонтрагентЯвляетсяНерезидентомСПогашеннойЗадолженностью(Контрагент);

а тебя интересует проверка номера накладной. Понадобится три секунды чтобы догадаться, что код не тот и можно ехать дальше. Но если ты увидешь в коде:

^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

тебе придётся вчитываться уже не на 3 секунды, а гораздо дольше
   Конструктор1С
 
85 - 11.12.20 - 16:12
(83) можно. Но даже там его понять будет проще, чем регулярное выражение
   vi0
 
86 - 11.12.20 - 16:19
(84) ну такую логику сначала запрограммировать надо, а там портянка будет дай бог
   Конструктор1С
 
87 - 11.12.20 - 16:19
Возвращаясь к говнокоду. Следующий код снабжен комментарием, что он делает понятно. При этом практически невозможно:
а) понять КАК код работает
б) найти и устранить ошибку
в) доработать этот код
со сложными регулярными выражениями дела обстоят примерно также

// 

//********************************* ПАДЕЖИ *************************************** 
// 

// (c) Jurer Production Begin ( Start ) 

// SuperJur.Narod.Ru 

// __________________________________________________________________ 
// Удаление этих строк незнаконно! 

// Гарантия 91 года и 1 месяц!!! 
// Послегарантийное обслуживание - бесплатно!!! 

// Круглосуточная поддержка - все 48 часов в бою! 
// Ссылка на источник обязательна! 

// Эти программы защищены законом об авторских правах. Запрещается перепродажа данной программы. 
// ПРОВЕРЕНО! ВИРУСОВ НЕТ!!! АНТИВИРУСОВ ТОЖЕ!!! 

// Смотри Милячуша в творительном !! 
// скупой слепой тупой - пропой!! 

// !№№! 
// !53! Очередное сокращение кода 

// !51! Прегромадное спасибо Олегу Дубровскому за оказанную моральную, информационную и материальную поддержку сего проекта. 
// Сергею Толкачёву за напоминание о том, что в русском языке всегда есть место исключениям! 

// !50! П:Ответственный за электрохозяйство Ф:Ацута Груша 
// !48! исправлена ошибка при склонении фамилий (спасибо, Mario). 

// !47! исправлена ошибка при склонении профессий ( спасибо, Павел Ковалев). 
// !46! оптимизация + четвертый параметр задает, что вернуть - фамилия, имя или отчество или всё сразу в нужном падеже 

// !42! Осел + Соловей + Воробей + Немец + Кормилец + Силиец 
// !41! отчества оканчивающиеся на "ы" считаются женскими ? 

// Функция для склонения одного слова!!! 
// z1 - само слово 

// z2 - номер падежа 
// z3 - пол 

// z4 - 1-склонять как фамилию, 2-имя, 3-отчество 
Функция ПадежС(z1,Знач z2=2,Знач z3="*",z4=0) Экспорт 
 z5=Найти(z1,"-"); 
 z6=?(z5=0,"","-"+ПадежС(Сред(z1,z5+1,СтрДлина(z1)-z5+1),z2,z3,z4)); 
 z1=НРег(?(z5=0,z1,Лев(z1,z5-1))); 
 z7=Прав(z1,3);z8=Прав(z7,2);z9=Прав(z8,1); 
 z5=СтрДлина(z1); 
 za=Найти("ая ия ел ок яц ий па да ца ша ба та га ка",z8); 
 zb=Найти("аеёийоуэюяжнгхкчшщ",Лев(z7,1)); 
 zc=Макс(z2,-z2); 
 zd=?(za=4,5,Найти("айяь",z9)); 
 zd=?((zc=1)или(z9=".")или((z4=2)и(Найти("оиеу"+?(z3="ч","","бвгджзклмнпрстфхцчшщъ"),z9)>0))или((z4=1)и(Найти("мия мяэ лия кия жая лея",z7)>0)),9,?((zd=4)и(z3="ч"),2,?(z4=1,?(Найти("оеиую",z9)+Найти("их ых аа еа ёа иа оа уа ыа эа юа яа",z8)>0,9,?(z3<>"ч",?(za=1,7,?(z9="а",?(za>18,1,6),9)),?(((Найти("ой ый",z8)>0)и(z5>4)и(Прав(z1,4)<>"опой"))или((zb>10)и(za=16)),8,zd))),zd))); 
 ze=Найти("лец вей бей дец пец мец нец рец вец аец иец ыец бер",z7); 
 zf=?((zd=8)и(zc<>5),?((zb>15)или(Найти("жий ний",z7)>0),"е","о"),?(z1="лев","ьв",?((Найти("аеёийоуэюя",Сред(z1,z5-3 ,1))=0)и((zb>11)или(zb=0))и(ze<>45),"",?(za=7,"л",?(za=10,"к",?(za=13,"йц",?(ze=0,"",?(ze<12,"ь"+?(ze=1,"ц",""),?(ze<37,"ц",?(ze<49,"йц","р")))))))))); 
 zf=?((zd=9)или((z4=3)и(z3="ы")),z1,Лев(z1,z5-?((zd>6)или(zf<>""),2,?(zd>0,1,0)))+zf+СокрП(Сред("а у а "+Сред("оыые",Найти("внч",z9)+1,1)+"ме "+?(Найти("гжкхш",Лев(z8,1))>0,"и","ы")+" е у ойе я ю я ем"+?(za=16,"и","е")+" и е ю ейе и и ь ьюи и и ю ейи ойойу ойойойойуюойойгомуго"+?((zf="е")или(za=16)или((zb>12)и(zb<16)),"и","ы")+"мм",10*zd+2*zc-3,2))); 
 Возврат ?(""=z1,"",?(z4>0,ВРег(Лев(zf,1))+?((z2<0)и(z4>1),".",Сред(zf,2)),zf)+z6); 
КонецФункции 
 
//_____________________________________________________________________________ 

// z1 - фамилия имя отчество например Железняков Юрий Юрьевич 
// z2 - Падеж ( по умолчанию = 2 - родительный) 

// 2 - родительный ( нет кого? ) Железнякова Юрия Юрьевича 

...........

// 

// (c) Jurer Production End ( Finish )
   vi0
 
88 - 11.12.20 - 16:20
   бомболюк
 
89 - 11.12.20 - 16:21
(84) сложные РВ в программах составляют из частей (ну например, из РВ для мыла целесообразно выделить под-РВ для IP-адреса, и так далее), а то запутаться легко, и тогда они вполне себе читаемы.
   Конструктор1С
 
90 - 11.12.20 - 16:22
(86) совершенно ничего страшного в портянке кода нет, если она аккуратненько инкапсулирована за вызовом метода с лаконичным названием. Когда ты пишешь "SELECT ... FROM" тебя же не интересует содержимое внутренностей. Хотя по-факту там могут отрабатывать миллионы строк
   vi0
 
91 - 11.12.20 - 16:24
(90) ну так все сводится к хорошей организации и оформлению кода, о чем я писал еще в начале
   Конструктор1С
 
92 - 11.12.20 - 16:35
(91) к сожалению, хорошая организация и оформление кода в 1с не часто радуют глаз, а вот такое на каждом шагу:

https://www.govnokod.ru/25603
https://www.govnokod.ru/24426
https://www.govnokod.ru/22113
   Конструктор1С
 
93 - 11.12.20 - 16:37
+(92) регулярки только добавят неразбериху в код. Представь что будет если скрестить (87) и регулярные выражения
   Dedal
 
94 - 11.12.20 - 16:37
(78) Зайди на https://regex101.com/ и проверь свое предположение сначала, а потом пиши =)
(84) Для этого и придумали комментарии, но честно говоря попользуешься ими и привыкаешь, глаз начинает видеть логику.
(88) Красивая штука, а чем это сделано?
   Timon1405
 
95 - 11.12.20 - 16:48
(94) предположение проверил: 11.22.1963 не находит, а должен
   vi0
 
96 - 11.12.20 - 17:26
   TormozIT
 
97 - 11.12.20 - 17:42
Для отладки сложных регулярных выражений я использую платный Regex Buddy. Но он не учитывает ограничений, имеющихся в реализации VBScript.RegExp
В ИР я сделал инструмент "Конструктор регулярных выражений" http://devtool1c.ucoz.ru/index/konstruktor_reguljarnogo_vyrazhenija/0-60 , который позволяет создавать и детально тестировать очень сложные (иерархические) выражения, но отлаживать последовательное выполнение выражения не позволяет - для этого предусмотрена интеграция с Regex Buddy.
Также в моем инструменте есть сборщик кода на встроенном языке, а также разборщик. Разборщик позволяет быстро восстановить иерархическое выражение из кода в набор выражений конструктора.
   TormozIT
 
98 - 11.12.20 - 17:44
(97) + Основное преимущество для 1Сника перед другими средствами разработки и тестирования рег. выражений - ты сразу видишь ровно тот результат, который получишь в сгенерированном коде, т.к. все делается через движок VBScript.RegExp


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.