powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / regexp со "*" на Linux/Windows
9 сообщений из 9, страница 1 из 1
regexp со "*" на Linux/Windows
    #38851878
hattifattener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые знатоки,

При переносе процедуры между платформами наступил на неприятные грабли:

Разбор строки на однородные подстроки осуществлялся выражением
Код: sql
1.
select regexp_matches('xaabbbccccddddd',E'((.)\\2*)','g');



На Linux/BSD отлично работает, на Windows ломается из-за неверной интерпретации звезды.

Проблему обошел через
Код: sql
1.
E'((.)(\\2+)?)'


но осадок остался.

Подскажите пожалуйста, с чем может быть связан такой эффект.

Версия 9.0.18.
...
Рейтинг: 0 / 0
regexp со "*" на Linux/Windows
    #38851890
этта
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hattifattener,
ща на винде постгреса нет. [недавно переставлял]. но таких багов не помню

навскидку убери префикс E и (сл-но) сними дабл \\ в регекспе [ '((.)\2*)' ]. ничего не поменяется, но вдруг(если да -- то и звизду экранируй с E).

я пр-льно понимаю, что * у вас квантификатор ?
...
Рейтинг: 0 / 0
regexp со "*" на Linux/Windows
    #38851960
этта
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hattifattener,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select regexp_matches('xaabbbccccddddd',E'((.)\\2*)','g');
"{x,x}"
"{aa,a}"
"{bbb,b}"
"{cccc,c}"
"{ddddd,d}"
SELECT version();
"PostgreSQL 9.2.8 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52), 64-bit"



винда:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select regexp_matches('xaabbbccccddddd',E'((.)\\2*)','g');
"{x,x}"
"{aa,a}"
"{bbb,b}"
"{cccc,c}"
"{ddddd,d}"
SELECT version();
"PostgreSQL 9.3.0, compiled by Visual C++ build 1600, 32-bit"


т.е. неясно, что у вас не фурыкает

вариант -- парсер не может понять [платформенная разница в ём] что и в каком порядке квантифицировать и делает \(2*) вместо (\2)*.
попробуйте явно выделить:
Код: sql
1.
2.
3.
4.
5.
6.
select regexp_matches('xaabbbccccddddd','(.)((\1)*)','g');
"{x,"",NULL}"
"{a,a,a}"
"{b,bb,b}"
"{c,ccc,c}"
"{d,dddd,d}"


ну и вариант с экранировкой звизды приведите
...
Рейтинг: 0 / 0
regexp со "*" на Linux/Windows
    #38852139
hattifattener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
этта,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
DB=# select regexp_matches('xaabbbccccddddd',E'((.)\\2*)','g');
   regexp_matches
---------------------
 {xaabbbccccddddd,x}
(1 row)

DB=# select version();
                           version
-------------------------------------------------------------
 PostgreSQL 9.0.3, compiled by Visual C++ build 1500, 32-bit
(1 row)

Для 9.3 работает. Наступалось только на 9.0.

В known bugs ничего похожего. Почему и спрашиваю - может кто в курсе.
...
Рейтинг: 0 / 0
regexp со "*" на Linux/Windows
    #38852150
hattifattener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
этта,

Вариант с '(.)((\1)*)' разбирает строку на символы, а E'(.)((\\1)*)' ломается на односимвольных подстроках и на винде и на линуксе.

Экранировка звезды приводит к тому, что квантификатора кагбе вообще нет, а есть символ звезда - и ведет себя соответсвенно.
...
Рейтинг: 0 / 0
regexp со "*" на Linux/Windows
    #38852395
этта
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hattifattenerэтта,
<>
Экранировка звезды приводит к тому, что квантификатора кагбе вообще нет, а есть символ звезда - и ведет себя соответсвенно.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select regexp_matches('xaabbbccccddddd',E'((.)\\2\*)','g');
"{x,x}"
"{aa,a}"
"{bbb,b}"
"{cccc,c}"
"{ddddd,d}"
SELECT version();
"PostgreSQL 9.2.8 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52), 64-bit"
--- вынь : -----------------------
select regexp_matches('xaabbbccccddddd',E'((.)\\2\*)','g');
"{x,x}"
"{aa,a}"
"{bbb,b}"
"{cccc,c}"
"{ddddd,d}"
SELECT version();
"PostgreSQL 9.3.0, compiled by Visual C++ build 1600, 32-bit"



похоже -- какой то баг парсера регекспов 9.0. т.е. экранировка "происходит" (если происходит) после разбора регекспа.
...
Рейтинг: 0 / 0
regexp со "*" на Linux/Windows
    #38852404
этта
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
покажите на 9.0 результат в винде и в постгресе

Код: sql
1.
2.
3.
SELECT E'((.)\\2\*)';
--
"((.)\2*)"
...
Рейтинг: 0 / 0
regexp со "*" на Linux/Windows
    #38852573
hattifattener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
--- linux ---

select E'((.)\\2\*)';
---
"((.)\2*)"

select regexp_matches('xaabbbccccddddd',E'((.)\\2\*)','g');
---
 {x,x}
 {aa,a}
 {bbb,b}
 {cccc,c}
 {ddddd,d}



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
--- вынь ---

select E'((.)\\2\*)';
---
"((.)\2*)"

select regexp_matches('xaabbbccccddddd',E'((.)\\2\*)','g');
---
"{xaabbbccccddddd,x}"



Верно, это я два слеша поставил, когда выражение начало звезду искать. Так получается первый случай.
Видимо таки unknown bug в парсере.
...
Рейтинг: 0 / 0
regexp со "*" на Linux/Windows
    #38852684
PgSQLanonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
-- windows:
select version();
---
"PostgreSQL 9.3.4, compiled by Visual C++ build 1600, 32-bit"

select regexp_matches('xaabbbccccddddd',E'((.)\\2\*)','g');
---
 {x,x}
 {aa,a}
 {bbb,b}
 {cccc,c}
 {ddddd,d}
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / regexp со "*" на Linux/Windows
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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