Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: INSERT REGEXP - удвоение точек

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
dumkan
Отправлено: 13 Октября, 2013 - 19:55:35
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2013  


Помог: 0 раз(а)




SELECT word FROM words WHERE word REGEXP '^КАРП.В\$'

такой запрос по идее должен находить запись КАРПОВ в таблице (она там есть), но не находит, а вот такой запрос его находит:

SELECT word FROM words WHERE word REGEXP '^КАРП..В\$'

пробовал так:
SELECT word FROM words WHERE word REGEXP '^КАРП[А-Я]В\$' - не находит
SELECT word FROM words WHERE word REGEXP '^КАРП[А-Я][А-Я]В\$ - находит

в чем дело не могу понять? Почему надо удваивать точки или символьный класс? А просто символы нормально ищутся?

P.S.
просто SELECT word FROM words WHERE word REGEXP '^КАРПОВ\$' тоже находит

P.S.S. Это может быть связано с кодировкой многобайтной utf-8?

(Отредактировано автором: 13 Октября, 2013 - 21:19:57)

 
 Top
Мелкий Супермодератор
Отправлено: 13 Октября, 2013 - 20:53:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




dumkan пишет:
такой запрос по идее должен находить

С чего это вдруг?
Не помню ни одного диалекта регулярных выражений, в котором одиночный символ успешно совпадал с двумя символами.


-----
PostgreSQL DBA
 
 Top
dumkan
Отправлено: 13 Октября, 2013 - 21:18:04
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2013  


Помог: 0 раз(а)




Мелкий пишет:
dumkan пишет:
такой запрос по идее должен находить

С чего это вдруг?
Не помню ни одного диалекта регулярных выражений, в котором одиночный символ успешно совпадал с двумя символами.


Еще раз проверил, но кажется все правильно, одиночный символ должен совпадать с одним символом - буквой О:

SELECT word FROM words WHERE word REGEXP '^КАРП.В\$'
такой запрос по идее должен находить запись КАРПОВ

Или я что-то не понимаю?
 
 Top
Мелкий Супермодератор
Отправлено: 13 Октября, 2013 - 23:05:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Кажется это я туплю. Завтра на свежую голову перечитаю.


-----
PostgreSQL DBA
 
 Top
dumkan
Отправлено: 14 Октября, 2013 - 08:14:04
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2013  


Помог: 0 раз(а)




Немного поэкспериментировал еще:
"SELECT word FROM words WHERE word REGEXP '^КАРПОВ$'"; - находит в базе слово КАРПОВ, логично

"SELECT word FROM words WHERE word REGEXP '^КАРП[О]В$'"; - вот такой запрос запись не находит, хотя кажется что в принципе все аналогично

"SELECT word FROM words WHERE word REGEXP '^КАРП[О][О]В$'"; - а вот такая запись слово КАРПОВ в базе находит.

P.S. с LIKE 'КАРП_В' все прокатывает, один символ подчеркивания - одна буква. Но мне надо именно REGEXP разобраться, запрос на самом деле сложнее нужен.

P.S.S. вот что еще вычитал в http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]#operator_regexp


Warning

The REGEXP and RLIKE operators work in byte-wise fashion, so they are not multi-byte safe and may produce unexpected results with multi-byte character sets. In addition, these operators compare characters by their byte values and accented characters may not compare as equal even if a given collation treats them as equal.
Недовольство, огорчение

P.S.S.S.
сохранил файл в win1251, поля таблицы тоже, запрос:
SELECT word FROM win1251 WHERE word REGEXP '^КАРПОВ$'
выдал ошибку:
Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'regexp'

(Отредактировано автором: 14 Октября, 2013 - 09:14:23)

 
 Top
Мелкий Супермодератор
Отправлено: 14 Октября, 2013 - 12:31:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Хм, печально. Я думал, у mysql дела с utf хорошо обстоят.

Гугление даёт 2 варианта:
0) никак. Проблеме уже седьмой год пошёл: http://bugs[dot]mysql[dot]com/bug.php?id=30241
1) ставить UDF: https://github[dot]com/mysqludf/lib_[dot][dot][dot]ludf_preg#readme

Потенциально некорректно, результат нужно перепроверять на приложении, но можно отбрасывать заведомо неверные варианты:
CODE (SQL):
скопировать код в буфер обмена
  1. word REGEXP '^КАРП[А-Я]{2}В$'

Т.е. для кириллицы указывать, что здесь два байта. По идее, можно регуляркой описать UTF8 более строго.


-----
PostgreSQL DBA
 
 Top
dumkan
Отправлено: 14 Октября, 2013 - 12:59:15
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2013  


Помог: 0 раз(а)




Что же так все печально в программировании??? Все через какую-то задницу делается Недовольство, огорчение
Потенциально некорректно делать не хочется, потому что если это у меня на Денвере заработает, не факт что на хостинге потом это будет нормально.

А задача была такая:
Есть такое понятие буквенно-цифровой код (БЦК). Применяется для запоминания чисел. Каждому числу сопоставляется пара согласных, 0 -н,м 1 -г,ж 2 -д,т и т.п. Чтобы запомнить число подбирается слово в котором эти согласные идут в нужном порядке, например ГНОМ будет соответствовать числу 100. Слова запоминаются гораздо легче цифр Зная слово легко получить соответствующее число. А вот придумать подходящее слово сходу не получается.
Хотелось написать запрос, который будет в базе по числу искать подходящие слова, что-то типа такого
^[ГЖ][А][АЕИЙОУЪЫЬЭЮЯ]*[НМ][АЕИЙОУЪЫЬЭЮЯ]*[НМ].* (для числа 100)

Собственно говоря каждому слову какое-то одно число соответствует, правильнее наверно будет в базу еще одно поле добавить с этим числом, прочитать слова потихоньку, по одному перевести в числа.
 
 Top
Мелкий Супермодератор
Отправлено: 15 Октября, 2013 - 09:59:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Буквы известны заранее?
Тогда можно использовать альтернативы:
^(Г|Ж)А(А|Е|И|Й|О|У|Ъ|Ы|Ь|Э|Ю|Я)*
Всё равно, очевидно, регулярка будет строиться динамически, есть явно повторяющиеся фрагменты.

dumkan пишет:
Потенциально некорректно делать не хочется

Речь о том, что можно использовать сперва грубый фильтр на стороне базы, затем на приложении проверить и отсеять результаты, выбранные ошибочно. Регулярки в PHP используют библиотеку PCRE, там юникод учитывается (но по соображениям обратной совместимости нужно указывать модификатор u).


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB