powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Нужен совет по написанию функции на pl/perl
4 сообщений из 29, страница 2 из 2
Нужен совет по написанию функции на pl/perl
    #34087416
shrdlu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
glebofffЧитаем там: Note : Remember that the backslash (\) already has a special meaning in PostgreSQL string literals. To write a pattern constant that contains a backslash, you must write two backslashes in the statement.
Или я уже безбожно туплю, или не знаю что. Про вышенаписанное я в курсе, и в оригинальной моей функции на pl/perl

if ( !($_TD->{new}{lastname} =~ /^[^A-Za-z0-9\!\@\#\$\%\^\&\*\(\)\_\+\=\\\/\?\,\.\<\>\~\`\"\'\;\:\{\}\[\]]+$/) ) {
$errstr.= "<br>\nCHECK_USERS: Недопустимый символ в поле ФАМИЛИЯ";
}

написаны именно two backslashes. Сейчас еще вспомнил тупизмы php, поизвращался с \\\, \\\\, \\\\\\... Не отлавливаются \, и хоть убейся. Я скоро спячу с этими палками...
...
Рейтинг: 0 / 0
Нужен совет по написанию функции на pl/perl
    #34087709
.gc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.gc
Гость
[quot shrdlu]
create table test (
uid serial8 primary key,
lastname varchar(64) not null,
firstname varchar(64) not null,
constraint empty_field
check ( lastname <> '' and firstname <> ''),
constraint valid_chars
check (convert(lastname , 'koi8', 'utf8') similar to '[А-Яа-я -]+')
);
[/src]У вас регексп неправильный. Т.к. диапазоны символов проверяются согласно кодовой таблицы установленной для базы, то в случае KOI8 правильный регексп:
Код: plaintext
( lastname  ~  '^[- Ю-Ъю-ъ]+$')
...
Рейтинг: 0 / 0
Нужен совет по написанию функции на pl/perl
    #34088759
shrdlu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
.gcУ вас регексп неправильный. Т.к. диапазоны символов проверяются согласно кодовой таблицы установленной для базы, то в случае KOI8 правильный регексп:
Код: plaintext
( lastname  ~  '^[- Ю-Ъю-ъ]+$')


Мой ИСХОДНЫЙ рэгэксп - правильный. Хотя и весьма неизящный, но работающий, вот маленький скрипт на perl, которым тестировалась его работа:

#!/usr/bin/perl
sub check {
if ($_[0] =~ /^[^A-Za-z0-9\!\@\#\$\%\^\&\*\(\)\_\+\=\\\/\?\,\.\<\>\~\`\"\'\;\:\{\}\[\]]+$/) {
print "Все символы допустимы.\n";
} else { print "Обнаружен недопустимый символ.\n" }
}
print "Проверка regexp - допустимость только русских букв, пробелов и дефиса.\n";
$text = 'И\'ван-в';print "Пример 1 - $text\n";&check($text);
$text = 'И ван-jв';print "Пример 2 - $text\n";&check($text);
$text = 'И\ван-в';print "Пример 3 - $text\n";&check($text);
$text = 'Иван-ов';print "Пример 4 - $text\n";&check($text);
$text = 'Иванов оглы';print "Пример 5 - $text\n";&check($text);
$text = 'Jonhs';print "Пример 6 - $text\n";&check($text);
exit;

Если не лень - скопируйте скрипт и проверьте результат его выполнения. У меня он выдает вот что:

# ./testregexp.pl
Проверка regexp - допустимость только русских букв, пробелов и дефиса.
Пример 1 - И'ван-в
Обнаружен недопустимый символ.
Пример 2 - И ван-jв
Обнаружен недопустимый символ.
Пример 3 - И\ван-в
Обнаружен недопустимый символ.
Пример 4 - Иван-ов
Все символы допустимы.
Пример 5 - Иванов оглы
Все символы допустимы.
Пример 6 - Jonhs
Обнаружен недопустимый символ.

Проблемы начинаются только при использовании данного регэкспа в функциях/проверках postgreSQL. С чем это связано - без понятия.
...
Рейтинг: 0 / 0
Нужен совет по написанию функции на pl/perl
    #34089883
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы исключить версию с кодировкой сделайте initdb в другом каталоге с полным указанием --lc-xxx, выполните set client_encoding=... перед выполнением скрипта.

Чтобы не задваивать бэкслеши пользуйтесь долларовыми кавычками.

Не поленился, проверил - ваш регэксп у меня работает (на виндовой версии, но в базе с koi8):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
koi=> select version(), current_setting('server_encoding') as srv, current_setting('client_encoding') as cln;
                                         version                                          | srv  | cln
------------------------------------------------------------------------------------------+------+------
 PostgreSQL  8 . 1 . 3  on i686-pc-mingw32, compiled by GCC gcc.exe (GCC)  3 . 4 . 2  (mingw-special) | KOI8 | KOI8

koi=> select s, s ~ $re$^[^A-Za-z0- 9 \!\@\#\$\%\^\&\*\(\)\_\+\=\\\/\?\,\.\<\>\~\`\"\'\;\:\{\}\[\]]+$$re$
koi-> from (
koi(> select 'И\'ван-в'
koi(> union all select 'И ван-jв'
koi(> union all select 'И\\ван-в'
koi(> union all select 'Иван-ов'
koi(> union all select 'Иванов оглы'
koi(> union all select 'Jonhs'
koi(> ) as n(s);
      s      | ?column?
-------------+----------
 И'ван-в     | f
 И ван-jв    | f
 И\ван-в     | f
 Иван-ов     | t
 Иванов оглы | t
 Jonhs       | f
( 6  rows)
...
Рейтинг: 0 / 0
4 сообщений из 29, страница 2 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Нужен совет по написанию функции на pl/perl
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]