Имя: Пароль:
1C
 
регулярные выражения RegExp
0 Александр056
 
13.12.16
15:31
всем доброго! надеюсь что кто-то смотрит сейчас не только на сиськи и зайдет в эту тему)
вопрос собственно в следующем:
для значений реквизитов определена проверка на их корректность заполнения, т.е. на кол-во цифр букв, символов и прочее... сделал так:
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = СформироватьСтрокуПаттерна(Выборка.маска);
RegExp.Test(ЗначениеРеквизита)

ЗначениеРеквизита = 1144 реквизит НомерКабинета
маска стоит 114\d т.е. первые три цифры "114" а дальше любое количество любых символов/цифр/букв, данный пример отрабатывает корректно, и всегда проверяет первые три цифры что бы они были именно 114.
Но! если поставить маску 114* т.е. на тот случай когда неизвестно сколько всего символов/букв/цифр может в себе содержать реквизит, то проверка на первые три цифры не работает! т.е. метод test возвращает истину всегда! хоть 5* поставить в маску хоть 44576*. Вопрос как должна выглядеть строка паттерна для проверки значения реквизита на определенное количество цифр(точное совпадение) и после этого сколько угодно и чего угодно?
1 Живой Ископаемый
 
13.12.16
15:35
* в регекспах не джокер
2 Timon1405
 
13.12.16
15:36
(0)
RegExp.Pattern = "^114?";
крышка вначале - начало строки, иначе будет ложное срабатыввние на "01144 реквизит НомерКабинета".
3 f_vadim
 
13.12.16
15:38
114.*
4 Александр056
 
13.12.16
15:38
(2) ^113? пропустил, хотя не должен был
5 f_vadim
 
13.12.16
15:40
а что делает СформироватьСтрокуПаттерна ?
6 Александр056
 
13.12.16
15:41
(5) из регистра получает соответсвие вот этих символов
http://www.script-coding.com/WSH/RegExp.html#4.
и тех что у меня пожелали пользаки.
и да! 114.* работает)! правда пока не понял почему)
7 Timon1405
 
13.12.16
15:41
(4) вы правы, после сисек трудно включать голову)
^114.*
8 Александр056
 
13.12.16
15:42
(7) да и надо ли?)))))))
9 Живой Ископаемый
 
13.12.16
15:43
2(6) А такая строка подходит:
"114     fg,kld"
10 f_vadim
 
13.12.16
15:43
(6) . - любой символ, * применяется к последнему набору, в данном случае на точку
11 Александр056
 
13.12.16
15:45
(10) т.е. любое количество символов для (точка) любого символа?
12 f_vadim
 
13.12.16
15:47
(11) .* - поиск любых симвлов в колчестве от 0 до бесконечности
13 Александр056
 
13.12.16
15:48
понял, запомню, спасибо большое, часика два так убил на это..... (12)
14 f_vadim
 
13.12.16
15:49
поэтому 5* возвращает истину, т.к. ноль пятёрок соответствует шаблону
15 Лефмихалыч
 
13.12.16
16:10
любобе количество любых символов - это ".*", а не просто ёжик.
16 Александр056
 
13.12.16
19:05
(15)  спасибо
17 orefkov
 
13.12.16
22:23
(15)
Любое количество любых символов вообще-то [\s\S] :)
.
не ловит перевод строки (\n)
18 orefkov
 
13.12.16
22:24
[\s\S]*
Форматирование звёздочку скушало.
19 Garykom
 
гуру
13.12.16
22:31
(0) Есть хороший сервис для изучения и экспериментов с RegExp, только аглицкий знать бы нуна, зато очень удобно потом http://regexr.com/3esbc
20 Адинэснег
 
13.12.16
23:01
в платформе когда-нить регулярки запилят?
21 Garykom
 
гуру
13.12.16
23:07
(20) угу и чтобы особо умные 1С-ники заюзали их для поиска по базе?
22 xReason
 
13.12.16
23:12
(20) Нет. Программистам 1С это не нужно.
23 Александр056
 
14.12.16
00:00
(22) почему? по-моему вполне себе тривиальная задачка, не думаю что я первый кому понадобилось)
24 Александр056
 
14.12.16
00:00
(19) читать могу, обращаясь к переводчику, посмотрю спасибо
25 Злопчинский
 
14.12.16
00:26
Есть куча прог для тестирования шаблонов, например, Espresso
26 Djelf
 
14.12.16
01:20
Не нравится мне RegExp, вот не нравится и все! PCRE веселее!
Где не запили? Да легко - http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/863#863
А вот зачем это делал сам не пойму ;)
27 orefkov
 
14.12.16
01:36
(26)
Насколько помню, через sqlite можно только проверить на совпадение, а само совпадение не получить.
28 Djelf
 
14.12.16
02:08
(27) Память не изменяет! И я об этом думал.
В штатном regexp подразумевается ответ true/false.
Но в sqlite есть механизм виртуальных таблиц, т.е. возможено  полноценно реализовать pcre_match, pcre_replace и pcre_split как таблицы.
Либо как функции, но на функцию годится только pcre_replace.
29 Djelf
 
14.12.16
02:28
Ну может и match, это как трактовать...
30 impulse9
 
14.12.16
06:42
(22) ну вообще регэкспы совсем бы не помешали, чтобы кучу всяких проверок не писать
31 Лефмихалыч
 
14.12.16
08:01
(18) да ладно. И даже если флаг global водрузить?
32 Александр056
 
15.12.16
15:36
а еще вопрос, ...4 - верно ли я понимаю что такая маска должна проверить что значение реквизита должно быть 3 любых символа а затем цифра 4?
33 Александр056
 
15.12.16
15:37
точнее так не отслеживает, если поставить ^ в начале то ок
34 Александр056
 
15.12.16
15:41
опишу точнее
T001909042 - значение
маска ХХХ4 - пропускает, все ок
маска ХХХ3 - не пропускает
маска ХХХ7 - не пропускает

как будто проверяет три любых символа, а затем проверка на наличие цифры в значении, независимо от позиции в значении реквизита
35 Timon1405
 
15.12.16
15:44
(34) он ищет первое вхождение в строку или все в зависимости от RegExp.Global = Истина;/ложь
сравните
https://regexper.com/#%5E...4
https://regexper.com/#...4
36 Александр056
 
15.12.16
15:44
маска ^ХХХ4 - проверяет с самого начала, т.е. проверит что на 4 месте цифра 4, независимо от длины значения реквизита
37 Fragster
 
гуру
15.12.16
15:44
вот этим удобно проверять
http://catalog.mista.ru/public/75941/
38 Александр056
 
15.12.16
15:45
(35) блин точно, спасибо большое
39 Djelf
 
15.12.16
15:59
* надо использовать как .*
а 1144 лучше оформлять группой (1144)
т.е. (1144).*
или с якорем ^(1144).* если надо с начала строки, а не посередине
Независимо от того, куда вы едете — это в гору и против ветра!