У меня есть таблица с ~ 500k строк; varchar (255) столбец UTF8 filename
содержит имя файла;
Я пытаюсь удалить различные странные символы из имени файла - думал, что я буду использовать класс символов: [^a-zA-Z0-9()_ .\-]
Теперь, есть ли в MySQL функция, которая позволяет заменять регулярное выражение ? Я ищу аналогичную функциональность функции REPLACE () - упрощенный пример приведен ниже:
SELECT REPLACE('stackowerflow', 'ower', 'over');
Output: "stackoverflow"
/* does something like this exist? */
SELECT X_REG_REPLACE('Stackoverflow','/[A-Zf]/','-');
Output: "-tackover-low"
Я знаю о REGEXP / RLIKE , но те только проверить , если есть совпадение, а не то , что матч есть.
(Я мог бы сделать " SELECT pkey_id,filename FROM foo WHERE filename RLIKE '[^a-zA-Z0-9()_ .\-]'
" из скрипта PHP, сделать " preg_replace
а потом" UPDATE foo ... WHERE pkey_id=...
", но это похоже на последний медленный и уродливый хак)
regexp_split
(функция + процедура) ®exp_replace
, которые реализованы с помощьюREGEXP
оператора. Для простых поисков это сделает свое дело. Вы можете найти это здесь - так, это путь с хранимым кодом MySQL, без UDF. Если вы обнаружите некоторые ошибки, на которые не распространяются известные ограничения - не стесняйтесь открывать проблему.Ответы:
С MySQL 8.0+ вы можете использовать встроенную
REGEXP_REPLACE
функцию.12.5.2 Регулярные выражения :
и поддержка регулярных выражений :
DBFiddle Demo
источник
MySQL 8.0+ :
Вы можете использовать встроенную
REGEXP_REPLACE
функцию.Старые версии:
Вы можете использовать пользовательскую функцию ( UDF ), например mysql-udf-regexp .
источник
Вместо этого используйте MariaDB. Имеет функцию
См. MariaDB документы и PCRE Улучшения регулярных выражений
Обратите внимание, что вы также можете использовать группировку регулярных выражений (я нашел это очень полезным):
возвращается
источник
UPDATE table SET Name = REGEXP_REPLACE(Name, "-2$", "\\1")
удаляет -2 из abcxyz-2 из целого столбца сразу.Мой метод грубой силы, чтобы заставить это работать, был просто:
mysqldump -u user -p database table > dump.sql
find /path/to/dump.sql -type f -exec sed -i 's/old_string/new_string/g' {} \;
Очевидно, что в файле есть и другие регулярные выражения perl.mysqlimport -u user -p database table < dump.sql
Если вы хотите убедиться, что строки нет в другом месте вашего набора данных, запустите несколько регулярных выражений, чтобы убедиться, что все они встречаются в одинаковой среде. Также не сложно создать резервную копию перед выполнением замены на случай, если вы случайно уничтожите что-то, что приведет к потере информации.
источник
мы решаем эту проблему, не используя регулярные выражения, этот запрос заменяет только строку с точным соответствием.
Пример:
После выполнения запроса:
источник
Недавно я написал функцию MySQL для замены строк с помощью регулярных выражений. Вы можете найти мой пост в следующем месте:
http://techras.wordpress.com/2011/06/02/regex-replace-for-mysql/
Вот код функции:
Пример выполнения:
источник
select regex_replace('.*(abc).*','\1','noabcde')
Хорошо, но, к сожалению, не работает с такими ссылками, как (возвращает 'noabcde', а не 'abc').Я рад сообщить, что, поскольку этот вопрос был задан, теперь есть удовлетворительный ответ! Взгляните на этот потрясающий пакет:
https://github.com/mysqludf/lib_mysqludf_preg
Пример SQL:
Я нашел пакет из этого поста в блоге как связанный по этому вопросу .
источник
ОБНОВЛЕНИЕ 2: Полезный набор функций регулярных выражений, включая REGEXP_REPLACE , теперь предоставлен в MySQL 8.0. Это делает чтение ненужным, если вы не ограничены использованием более ранней версии.
ОБНОВЛЕНИЕ 1: Теперь превратили это в сообщение в блоге: http://stevettt.blogspot.co.uk/2018/02/a-mysql-regular-expression-replace.html
Следующее расширяет функции, предоставляемые Rasika Godawatte, но обходит все необходимые подстроки, а не просто проверяет отдельные символы:
демонстрация
Rextester Demo
Ограничения
\1
,\2
и т. Д.) Вместо групп захвата. Если эта функциональность необходима, пожалуйста, посмотрите этот ответ котором предпринята попытка найти обходной путь путем обновления функции, чтобы позволить вторичный поиск и замену в каждом найденном совпадении (за счет повышения сложности).^
и / или$
используется в шаблоне, они должны быть в самом начале и в самом конце соответственно - например, шаблоны,(^start|end$)
которые не поддерживаются.a.*?b.*
) не поддерживается.Примеры использования
Эта функция была использована для ответа на следующие вопросы StackOverflow:
источник
Вы можете "сделать" это ... но это не очень мудро ... это примерно так же смело, как я постараюсь ... насколько полная поддержка RegEx позволяет вам гораздо лучше использовать Perl или тому подобное.
источник
Мы можем использовать условие IF в запросе SELECT, как показано ниже:
Предположим, что для чего-либо с «ABC», «ABC1», «ABC2», «ABC3», ... мы хотим заменить на «ABC», а затем с помощью условий REGEXP и IF () в запросе SELECT, мы можем достичь этого ,
Синтаксис:
Пример:
источник
Нижеследующее в основном находит первое совпадение слева, а затем заменяет все его совпадения (проверено в MySQL-5,6).
Применение:
Реализация:
источник
Я думаю, что есть простой способ добиться этого, и у меня это хорошо работает.
ВЫБРАТЬ строки, используя REGEX
ОБНОВИТЬ строки с помощью REGEX
REGEXP Ссылка: https://www.geeksforgeeks.org/mysql-regular-expressions-regexp/
источник