powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / REGEXP: после класса символов ничего не понимает
14 сообщений из 14, страница 1 из 1
REGEXP: после класса символов ничего не понимает
    #38844121
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот регулярка:
Код: sql
1.
SELECT "test1" REGEXP "[:alnum:]+"

= 1
Код: sql
1.
SELECT "test1" REGEXP ".+"

= 1

Если что-нибудь добавить после класса символов [:alnum:]+, строка проверку не проходит:
Код: sql
1.
SELECT "test1" REGEXP "[:alnum:]+1"

= 0
Код: sql
1.
SELECT "test1" REGEXP "([:alnum:]+)1"

= 0
Код: sql
1.
SELECT "test1" REGEXP "([:alnum:]+)(1)"

= 0

Что за артефакт ?
...
Рейтинг: 0 / 0
REGEXP: после класса символов ничего не понимает
    #38844123
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если класс символов заменить, например, на точку (любой символ), проблема уходит:
Код: sql
1.
SELECT "test1" REGEXP ".+1"

= 1
...
Рейтинг: 0 / 0
REGEXP: после класса символов ничего не понимает
    #38844131
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Классы POSIX предназначены для использования в классах символов, так что заключайте их в квадратные скобкиавтор
Хорошо, делаем так:
Код: sql
1.
SELECT "test1" REGEXP "[[:alnum:]]+1"

= 0
И всё равно не работает.
...
Рейтинг: 0 / 0
REGEXP: после класса символов ничего не понимает
    #38844257
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Классы POSIXВ MySQL регэкспы не посиксовые, а перловые, насколько я в курсе.

Тут, имхо, дело в жадности. [:alnum:]+ забирает себе все символы, включая единицу. И единице из регекспа уже соответствия не находится.
...
Рейтинг: 0 / 0
REGEXP: после класса символов ничего не понимает
    #38844309
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ MySQL регэкспы не посиксовые, а перловые, насколько я в курсе.Эта цитата, которую я привёл, - из справки по MySQL:
Классы POSIX предназначены для использования в классах символов, так что заключайте их в квадратные скобки

авторТут, имхо, дело в жадности. [:alnum:]+ забирает себе все символы, включая единицу. И единице из регекспа уже соответствия не находится. Вы чего-то не то говорите. Если при захвате конструкцией [:alnum:]+ всех символов строка регулярке не соответствует, то объём захвата уменьшается на 1 символ и снова проверяется соответствие (возможность обеспечения соответствия) регулярке. Так работают жадные квантификаторы. Как на Луне - не знаю.

-------------------------------------------------------------------------------------------
К примеру, в php строка "test1" регулярке "/\w+1/" соответствует (кстати, тот же самый жадный квантификатор + ). А в MySQL что-то никак...
...
Рейтинг: 0 / 0
REGEXP: после класса символов ничего не понимает
    #38844321
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще гипотеза:
http://dev.mysql.com/doc/refman/5.5/en/regexp.html#operator_regexp A character class may not be used as an endpoint of a range.
Код: sql
1.
2.
SELECT "testt" REGEXP "[:alnum:]+t";
SELECT "testt" REGEXP "[a-z]+t"

Выдает
0
1

Похоже, в случае с символьными классами + работает как сверхжадный.
...
Рейтинг: 0 / 0
REGEXP: после класса символов ничего не понимает
    #38844370
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

[[:alnum:]]+1
...
Рейтинг: 0 / 0
REGEXP: после класса символов ничего не понимает
    #38844378
JeStone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Вот регулярка:
Код: sql
1.
SELECT "test1" REGEXP "[:alnum:]+"

= 1
А как вы здесь получили в результате 1? У меня 0 выдает.
А вот этот вариант выдает корректно единицу
Код: sql
1.
SELECT "test1" REGEXP "[[:alnum:]]+"



Cyrax_02Хорошо, делаем так:
SELECT "test1" REGEXP "[[:alnum:]]+1"
= 0
И всё равно не работает.

У меня этот пример выдает результат 1
...
Рейтинг: 0 / 0
REGEXP: после класса символов ничего не понимает
    #38844586
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, итог такой. Символьные классы [: ... :] в MySQL (также, как и в php) работают только внутри группирующих скобок :
... [ [:alnum:] ] ...
... [ [:alnum:][:blank:]() ] ...

При использовании символьных классов НЕ внутри группирующих скобок операция RLIKE/REGEXP всегда будет возвращать 0 (регулярное выражение будет синтаксически некорректными):
Код: sql
1.
2.
SELECT "test1" REGEXP "[[:alnum:]]+"
SELECT "test1" REGEXP "[[:alnum:]]+1"


====================================
Как я вчера получил единицу на этом примере:
Код: sql
1.
SELECT "test1" REGEXP "[:alnum:]+"

и 0 - на этом:
Код: sql
1.
SELECT "test1" REGEXP "[[:alnum:]]+1"

- мне самому непонятно.

P.S. В php (реализован pcre ) символьными классами никогда не пользовался - обходился спец.классами \s, \S, \w, \W, \d, \D и группирующими скобками. А в php, как оказалось, символьные классы тоже допустимо использовать только внутри группирующих скобок .
...
Рейтинг: 0 / 0
REGEXP: после класса символов ничего не понимает
    #38844590
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В любом случае, я уже перешёл с регулярных выражений MySQL на регулярные выражения php:
1) извлекаю все нужные данные из БД
2) на php выполняю preg_match для отобранных строк данных
Поскольку MySQL на операции REGEXP/RLIKE и так у себя обрабатывает все строки перебором, то время выполнения будет приблизительно то же.

А плюсы получаем следующие:
1) Поддержка спец.классов \s, \S, \w, \W, \d, \D
2) Поддержка именованных групп
3) Поддержка модификаторов
Ничего этого в MySQL нет.
...
Рейтинг: 0 / 0
REGEXP: после класса символов ничего не понимает
    #38844595
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02А плюсы получаем следующие:Добавьте поддержку юникода.
В MySQL-ных регулярках ее тоже нет.
...
Рейтинг: 0 / 0
REGEXP: после класса символов ничего не понимает
    #38844604
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДобавьте поддержку юникода.
В MySQL-ных регулярках ее тоже нет. Даже если все кодировки установлены в utf ?
...
Рейтинг: 0 / 0
REGEXP: после класса символов ничего не понимает
    #38844611
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02авторДобавьте поддержку юникода.
В MySQL-ных регулярках ее тоже нет. Даже если все кодировки установлены в utf ? http://dev.mysql.com/doc/refman/5.5/en/regexp.html#operator_regexp The REGEXP and RLIKE operators work in byte-wise fashion, so they are not multibyte safe and may produce unexpected results with multibyte character sets.
...
Рейтинг: 0 / 0
REGEXP: после класса символов ничего не понимает
    #38844620
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftCyrax_02пропущено...
Даже если все кодировки установлены в utf ? http://dev.mysql.com/doc/refman/5.5/en/regexp.html#operator_regexp The REGEXP and RLIKE operators work in byte-wise fashion, so they are not multibyte safe and may produce unexpected results with multibyte character sets.Полный список:
1) Поддержка спец.классов \s, \S, \w, \W, \d, \D
2) Поддержка именованных групп
3) Поддержка модификаторов
4) Поддержка юникода (частный случай п.3)

Я всем регуляркам, полученным из БД, добавляю 2 модификатора:
Код: php
1.
/.../iu
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / REGEXP: после класса символов ничего не понимает
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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