|
регулярные выражения 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
|
||||
38
Александр056
15.12.16
✎
15:45
|
(35) блин точно, спасибо большое
|
|||
39
Djelf
15.12.16
✎
15:59
|
* надо использовать как .*
а 1144 лучше оформлять группой (1144) т.е. (1144).* или с якорем ^(1144).* если надо с начала строки, а не посередине |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |