|
Регулярка, найти слово, опережающие и ретроспективные проверки | ☑ | ||
---|---|---|---|---|
0
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а-яА-Я]
|
|||
4
Ненавижу 1С
гуру
11.12.20
✎
08:48
|
у каждой библиотеки свой диалект регулярки
|
|||
5
polosov
11.12.20
✎
09:09
|
(0) (^|\s*)Маша(\s*|$)
|
|||
6
polosov
11.12.20
✎
09:47
|
Или как-то так
([^А-Яа-яA-Za-z0-9-])Маша([^А-Яа-яA-Za-z0-9-]) |
|||
7
Кирпич
11.12.20
✎
09:58
|
(6) 'Ёё' еще добавить на всякий случай
|
|||
8
polosov
11.12.20
✎
10:04
|
(7) Да, совершенно верно.
|
|||
9
TormozIT
гуру
11.12.20
✎
10:18
|
(0) VBScript реализация не поддерживает просмотр вперед назад без поглощения. Поэтому смириться, либо юзать ВК с инфорстарта, которые все работают медленнее и глючнее, но зато поддерживают эту фичу.
|
|||
10
Ненавижу 1С
гуру
11.12.20
✎
10:34
|
(7) ^(\W|\d) - буквенный символ
\p{L} - аналогично но все сильно от диалекта зависит |
|||
11
vladnet
11.12.20
✎
10:42
|
Понял спасибо всем. Остановился на варианте ([^\wА-Яа-я0-9ёЁ]|^)Маша(?![\wа-яА-ЯёЁ])
Сделал начало как здесь (6), только добавил начало строки иначе почему то слова в начале отсекало. Добавил ё как (7), действительно ё как букву не искало. Буду видимо смотреть за длиной и если длина больше чем длина поисковой строки, то буду менять слово с позиции + 1. Странно что 1с уже и работу с математикой и двоичными данными сделал, а компоненту работы с регулярными выражениями не добавят. |
|||
12
vladnet
11.12.20
✎
10:48
|
(9) Так и думал, спасибо что подтвердил мои подозрения.
(10) а куда это засунуть? Наверное уже лучше не будет, текущего варианта. |
|||
13
vi0
11.12.20
✎
10:52
|
(0) а что за прикладная задача? без регулярок не решить?
|
|||
14
Вафель
11.12.20
✎
10:55
|
но задача найти слово - это же самая элементарная задача
|
|||
15
vi0
11.12.20
✎
10:59
|
(14) хз, \bМаша\b не работает в 1с
|
|||
16
Конструктор1С
11.12.20
✎
11:01
|
Вот вы такие красавцы вкорячиваете регулярки в 1с, а следующие программисты потом страдай. Занимательные головоломки им обеспечены
|
|||
17
Конструктор1С
11.12.20
✎
11:02
|
Хуже регулярных выражений код запутывает разве что обфускация
|
|||
18
vi0
11.12.20
✎
11:04
|
(17) ну если задача требует регулярки, то аналогичный код на 1с будет не намного читабельнее
|
|||
19
Конструктор1С
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) А можно почитать в википедии, что такое регулярки и пользоваться на здоровье.
|
|||
23
vi0
11.12.20
✎
11:13
|
(20) можно поподробнее?
|
|||
24
Конструктор1С
11.12.20
✎
11:22
|
(21) регулярки для гибкого поиска по тексту. А код они запутывают мама не горюй
|
|||
25
SiAl-chel
11.12.20
✎
11:28
|
(24) Нет, не запутывают. Их просто надо понять и запомнить, как таблицу умножения.
|
|||
26
Кирпич
11.12.20
✎
11:31
|
(24) регулярки придумали, чтобы делать поиск по тексту не запутывая код.
|
|||
27
vladnet
11.12.20
✎
11:36
|
Задача простая - поиск и замена. Поддержка слова целиком. Подумал что так правильнее будет делать. Хотя сейчас понимаю что задачу я бы уже сделал если бы без этого делал.
|
|||
28
vi0
11.12.20
✎
11:37
|
(24) я думаю что дело как всегда в конкретном программисте
если он "вкорячивает" где не нужно то это проблема, а если позаботится о коллегах и оформит код то.. можно и на 1с написать так что не поймешь, что и бывает |
|||
29
vladnet
11.12.20
✎
11:38
|
Наверное так и оставлю поиск через регулярку, потому что искать через СтрНайти и обрабатывать концы, выглядит корявее.
|
|||
30
vladnet
11.12.20
✎
11:40
|
(24)(28) Поддержу, регулярки это всего лишь инструмент. Если пользоваться с умом, то в плюс.
|
|||
31
Конструктор1С
11.12.20
✎
12:18
|
(25) сильно запутывают. Регулярное выражение из 30 символов ты будешь долго зачитывать-перечитывать, прежде чем поймешь его логику
|
|||
32
Кирпич
11.12.20
✎
12:34
|
(31) Так то не код запутанный, а регулярное выражение запутанное. Код то тут при чем.
Регулярка из 30 символов может заменить код на два экрана. Проще прочитать 30 символов или два экрана? Просто надо понимать регулярки и всё. 99% программистов их более менее понимают. |
|||
33
Конструктор1С
11.12.20
✎
12:47
|
(32) а регулярное выражение это не часть кода?
"Регулярка из 30 символов может заменить код на два экрана. Проще прочитать 30 символов или два экрана?" Прочитать <> понять. 30 символов ты прочитаешь за секунды, а вот на расшифровку этого регулярного выражения у тебя может уйти времени больше, чем на чтение двух экранов кода. "Просто надо понимать регулярки и всё. 99% программистов их более менее понимают" ну ок. Что делает вот это регулярное выражение? [a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$ |
|||
34
vi0
11.12.20
✎
12:48
|
(15) тут пишут что \b для юникода не работает в VBA
https://coderoad.ru/11867580/VBA-Excel-regex-b-граница-слова-не-совпадает-если-слово-находится-в-начале |
|||
35
vi0
11.12.20
✎
12:50
|
(33) на контекст бы взглянуть сначала
ну и можно инструменты использовать для отладки и визуализации https://www.debuggex.com/ |
|||
36
vi0
11.12.20
✎
12:52
|
(33) [@], [.] - зачем скобки там?
|
|||
37
Ненавижу 1С
гуру
11.12.20
✎
12:53
|
(33) проверяет валидность e-mail
|
|||
38
vi0
11.12.20
✎
12:55
|
(36) а понятно, экранирование такое
|
|||
39
leonidkorolev
11.12.20
✎
12:58
|
Комментарии к регуляркам никто же не отменял. Бывает и с кодом без комментов долго разбираешся
|
|||
40
Конструктор1С
11.12.20
✎
13:01
|
(36) вот видишь, хренота нечитаемая. Так это ещё простой пример. Представь что будет, если одно регулярное выражение будет поставщиком данных для второго, а то для третьего?
|
|||
41
vi0
11.12.20
✎
13:09
|
(40) на самом деле легко читаемая там есть избыточность:
вместо [@] можно просто написать @ вместо [.] можно написать \. - это стандартное экранирование, но программист решил в скобки загнать ну если регулярки знать то вполне читаемо |
|||
42
polosov
11.12.20
✎
13:13
|
(40) Тоже так думал несколько лет назад. Теперь если надо что-то извлечь из текста, то первым делом регулярки использую.
|
|||
43
vi0
11.12.20
✎
13:15
|
(40) в нормальных диалектах можно одно выражение написать в нескольких строках с отступами и комментариями
например см здесь внизу страницы https://sekrasoft.livejournal.com/60316.html |
|||
44
vi0
11.12.20
✎
13:17
|
(43) +
console.log(createRegExp(function(){/* / \s+ -- непустая последовательность пробельных символов (пробелы, переносы строки) | -- или - - -- строки, начинающиеся на "--" .*? -- содержащие некоторое количество символов ( (?= \*\/ ) -- и заканчивающиеся либо символом закрытия комментария JS... -- важно не удалить закрытие комментария JS вместе с комментарием регулярного выражения -- иначе второе регулярное выражение из createRegExp не будет соответствовать строке -- (поэтому и используется ?=, чтобы комментарий не захватывался) | -- ...или $ -- концом строки ) / g -- причём, замена по этому регулярному выражению будет выполнена несколько раз, m -- а $ символизирует конец подстроки |
|||
45
Timon1405
11.12.20
✎
13:24
|
с регулярками есть очень тонкий момент: (цитата из Фридла) РВ должно совпадать там где должно и не совпадать там где не должно. к сожалению, многие наспех написанные РВ не попадают под вторую часть цитаты и при новых входных данных происходят неожиданные вещи. сложность в том, что новые входные данные могут прилететь не сразу, а через полгода и хорошо если вам, а не вашему сменщику. а времени сразу написать правильное выражение продумав бОльшую часть вариантов как правило нет. что далеко ходить, еЁ в этой теме всплыли не сразу.
|
|||
46
Конструктор1С
11.12.20
✎
13:27
|
(42) не убедительно. Вася Пупкин "когда надо" пишет говнокод. Но говнокод от этого хорошим не становится
|
|||
47
polosov
11.12.20
✎
13:52
|
(46) А я и не убеждаю. Я пишу как было у меня. РВ это инструмент, который удобно использовать для работы с парсингом строк. Маленькое короткое выражение может заменить простыню кода на языке, на котором ты пишешь. Но если ты не умеешь этим инструментом пользоваться, то твое дело изучать его или писать парсинг на языке, который знаешь.
|
|||
48
Кирпич
11.12.20
✎
13:53
|
(33) ну так ты напиши в комментарии, что оно делает и все дела.
Для полноты картины, напиши то же самое, что делает твоя регулярка, на языке 1с. |
|||
49
Кирпич
11.12.20
✎
14:00
|
+(48) да еще чтобы можно было потом этот код легко подправить. В регулярке ты три буквы поменяешь и готово, а в коде нужно понять как что и где менять. Регулярку ты можешь в любой момент проверить и отладить на https://regex101.com, а писанину твою проще выкинуть и заново написать, ибо все пишут по разному.
|
|||
50
vi0
11.12.20
✎
14:11
|
(45) а что Фридл говорит о наспех написанном собственном парсинге при новых входных данных?)
|
|||
51
Конструктор1С
11.12.20
✎
14:22
|
(49) тот, кто пишет угрёбищный нечитаемый код, напишет ещё куда более угрёбищные и менее читаемые регулярные выражения
"Регулярку ты можешь в любой момент проверить и отладить на" Ты себя-то послушай. Допустим, разбираю я некий код, написанный другим программистом. Где-то в недрах этого кода обрабатывается текст, с ошибками. Наткнулся я на регулярку... ухожу на сайт, отлаживаю в течении получасика и потом убеждаюсь, что это вообще не та регулярка. В то время как нормальный код мог именами переменных и методов рассказать, что же он тут вообще делает. Если для выяснения логики кода нужно лазить с отладчиком, то это хреновый код |
|||
52
Кирпич
11.12.20
✎
14:25
|
(51) ну тогда всё. регулярки говно. нужно их придумать обратно.
|
|||
53
Конструктор1С
11.12.20
✎
14:29
|
(52) регулярки, как и многие специфические возможности, нужно использовать очень осторожно и как можно реже. Если есть возможность обойтись без регулярок, то лучше обойтись. То же самое выражение из (33) легко проверилось бы обычным кодом в несколько строк
|
|||
54
polosov
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])+)\]) |
|||
57
Timon1405
11.12.20
✎
14:46
|
(50) он них никуда не даться, у него посыл что нужно посидеть и вдумчиво подумать чтобы учесть максимум Первоначальных вариантов).
пример, парсинг даты. даже отбросив в сторону разные форматы разделителей и американцев со своими перевернутыми датами и тупо написав "\d\d\.\d\d\.\d\d\d\d" получим совпадение на 35.декабря, хотя не должны(2я часть цитаты) . значит шаг первый: ограничить день до 31, шаг второй: 31 апреля быть не может, шаг третий 29 февраля тоже не всегда итд., это бесконечно. в общем, идеала не будет но к нему нужно стремиться) |
|||
58
Конструктор1С
11.12.20
✎
14:54
|
(55) не задолбаешься. Ушло целых 10 минут
Функция ЕмейлПравильный(Адрес) Если Не ТолькоДопустимыеСимволы(Адрес) Тогда Возврат Ложь; КонецЕсли; Если СтрЧислоВхождений(Адрес, "@") <> 1 Тогда Возврат Ложь; КонецЕсли; Домен = СтрРазделить(Адрес, "@")[1]; Если СтрЧислоВхождений(Домен, ".") = 0 Тогда Возврат Ложь; КонецЕсли; Если Не ТолькоДопустимыеСимволы(Домен) Тогда Возврат Ложь; КонецЕсли; Возврат Истина; КонецФункции // ЕмейлПравильный() Функция ТолькоДопустимыеСимволы(Знач Строка) ДопустимыеСимволы = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-.@"; Для Инд = 1 По СтрДлина(Строка) Цикл Символ = Сред(Строка, Инд, 1); Если СтрЧислоВхождений(ДопустимыеСимволы, ВРег(Символ)) = 0 Тогда Возврат Ложь; КонецЕсли; КонецЦикла; Возврат Истина; КонецФункции // ТолькоДопустимыеСимволы() |
|||
59
polosov
11.12.20
✎
14:58
|
(58) А теперь используй свой код для того, чтобы выдернуть из 10МБ текста, все адреса.
|
|||
60
Конструктор1С
11.12.20
✎
14:59
|
(59) так и (33) не выделит
|
|||
61
Конструктор1С
11.12.20
✎
15:02
|
+(60) но если очень уж понадобилось бы, достаточно добавить ешё пару функций
|
|||
62
polosov
11.12.20
✎
15:03
|
(60) Выделит.
|
|||
63
polosov
11.12.20
✎
15:08
|
5 строчек против 50-100
|
|||
64
polosov
11.12.20
✎
15:08
|
(63) к (61)
|
|||
65
_DAle_
11.12.20
✎
15:10
|
(58) Этот код же не эквивалентен регэкспу, еще много дописать нужно.
|
|||
66
Конструктор1С
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
|
|||
68
Конструктор1С
11.12.20
✎
15:20
|
+(66) всего-то 6 строчек кода. Только вот код абсолютно нечитаемый. В то время как 1000 строк кода может быть легко читаемыми
|
|||
69
Dedal
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})$
Кто не может в РВ то не программист, а обычный эникейщик. |
|||
70
Конструктор1С
11.12.20
✎
15:28
|
(65) да, ещё нужно дописывать. Но заметь, ты быстро понял логику этого кода, и у тебя родилось понимание неполноценности кода. В то время как попробуй-ка при чтении (56) понять, что вообще делает эта строка
|
|||
71
polosov
11.12.20
✎
15:29
|
(67) Одну циферку поменять и будет info
|
|||
72
polosov
11.12.20
✎
15:31
|
(70) Ну так-то можно и язык запросов не учить и объектно вытаскивать данные. Код тоже будет читаемым.
|
|||
73
_DAle_
11.12.20
✎
15:32
|
(70) Ну, мне лично тот регэксп, хоть он и какой-то кривой, было понять проще, чем код. В коде сложнее сразу словить ограничения на входную строку. Я согласен, что регэкспы часто пихают туда, куда не нужно, но пример с e-mail'ом - это не тот случай, как мне кажется.
|
|||
74
Йохохо
11.12.20
✎
15:33
|
(71) [email protected].
|
|||
75
vi0
11.12.20
✎
15:38
|
вот статья которую рекомендуют многие https://habr.com/ru/post/349860/
про (56) автор статьи говорит следующее: не надо так делать!!! и называет ее write-only |
|||
76
Кирпич
11.12.20
✎
15:40
|
(70) //понять, что вообще делает эта строка
эта строка будет в функции ЕмейлПравильный(Адрес) догадаться можно, если не тупой конечно |
|||
77
polosov
11.12.20
✎
15:42
|
(74) Тоже небольшая переделка.
|
|||
78
Timon1405
11.12.20
✎
15:45
|
(69) 11.22.1963 - даже сериал такой есть. а теперь поправьте копипасту для учета американского формата дат
|
|||
79
Конструктор1С
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}$",Адрес); КонецФункции вроде всё понятно |
|||
81
Конструктор1С
11.12.20
✎
15:50
|
(80) так понятно. А если "сие творение окажется где-нибудь в недрах портяночного метода на тыщу строк" будет нифига не понятно
|
|||
82
polosov
11.12.20
✎
15:51
|
(81) Тогда учи регулярки, ничего не поделаешь.
|
|||
83
Кирпич
11.12.20
✎
15:52
|
(81) Твое творение тоже можно засунуть в недра портяночного метода на тыщу строк
|
|||
84
Конструктор1С
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 секунды, а гораздо дольше |
|||
85
Конструктор1С
11.12.20
✎
16:12
|
(83) можно. Но даже там его понять будет проще, чем регулярное выражение
|
|||
86
vi0
11.12.20
✎
16:19
|
(84) ну такую логику сначала запрограммировать надо, а там портянка будет дай бог
|
|||
87
Конструктор1С
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 ) |
|||
88
vi0
11.12.20
✎
16:20
|
||||
89
бомболюк
11.12.20
✎
16:21
|
(84) сложные РВ в программах составляют из частей (ну например, из РВ для мыла целесообразно выделить под-РВ для IP-адреса, и так далее), а то запутаться легко, и тогда они вполне себе читаемы.
|
|||
90
Конструктор1С
11.12.20
✎
16:22
|
(86) совершенно ничего страшного в портянке кода нет, если она аккуратненько инкапсулирована за вызовом метода с лаконичным названием. Когда ты пишешь "SELECT ... FROM" тебя же не интересует содержимое внутренностей. Хотя по-факту там могут отрабатывать миллионы строк
|
|||
91
vi0
11.12.20
✎
16:24
|
(90) ну так все сводится к хорошей организации и оформлению кода, о чем я писал еще в начале
|
|||
92
Конструктор1С
11.12.20
✎
16:35
|
(91) к сожалению, хорошая организация и оформление кода в 1с не часто радуют глаз, а вот такое на каждом шагу:
https://www.govnokod.ru/25603 https://www.govnokod.ru/24426 https://www.govnokod.ru/22113 |
|||
93
Конструктор1С
11.12.20
✎
16:37
|
+(92) регулярки только добавят неразбериху в код. Представь что будет если скрестить (87) и регулярные выражения
|
|||
94
Dedal
11.12.20
✎
16:37
|
(78) Зайди на https://regex101.com/ и проверь свое предположение сначала, а потом пиши =)
(84) Для этого и придумали комментарии, но честно говоря попользуешься ими и привыкаешь, глаз начинает видеть логику. (88) Красивая штука, а чем это сделано? |
|||
95
Timon1405
11.12.20
✎
16:48
|
(94) предположение проверил: 11.22.1963 не находит, а должен
|
|||
96
vi0
11.12.20
✎
17:26
|
||||
97
TormozIT
гуру
11.12.20
✎
17:42
|
Для отладки сложных регулярных выражений я использую платный Regex Buddy. Но он не учитывает ограничений, имеющихся в реализации VBScript.RegExp
В ИР я сделал инструмент "Конструктор регулярных выражений" http://devtool1c.ucoz.ru/index/konstruktor_reguljarnogo_vyrazhenija/0-60 , который позволяет создавать и детально тестировать очень сложные (иерархические) выражения, но отлаживать последовательное выполнение выражения не позволяет - для этого предусмотрена интеграция с Regex Buddy. Также в моем инструменте есть сборщик кода на встроенном языке, а также разборщик. Разборщик позволяет быстро восстановить иерархическое выражение из кода в набор выражений конструктора. |
|||
98
TormozIT
гуру
11.12.20
✎
17:44
|
(97) + Основное преимущество для 1Сника перед другими средствами разработки и тестирования рег. выражений - ты сразу видишь ровно тот результат, который получишь в сгенерированном коде, т.к. все делается через движок VBScript.RegExp
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |