#php #mysql #regex
#php #mysql #регулярное выражение
Вопрос:
В MySQL результаты DESCRIBE table_name или SHOW COLUMNS ДЛЯ table_name содержат поле типа, которое для чисел с плавающей запятой, десятичных знаков и удвоений может выглядеть как десятичное (15,3) или просто десятичное. То же самое следует для чисел с плавающей запятой и double.
В настоящее время у меня есть:
'/^float|decimal|double(?:((d ),(d )))?$/'
Как мне нужно изменить это регулярное выражение, чтобы (15,3) было необязательным?
Обновление (2): несмотря на то, что (15,3) является необязательным, мне все равно нужно записать два значения, если они есть. Добавление ? сработало, но теперь оно не фиксирует 15 и 3. Предложения?
Ответ №1:
'/^(?:float|decimal|double)(?:((d ),(d )))?/'
Окружите ((d ),(d ))
часть группой без захвата ( (?:)
) и сделайте ее необязательной ( ?
).
Кстати: $
в конце отсутствует намеренно?
Комментарии:
1. Нет. Я не знал, что мне это нужно.
2. Мне все еще нужно захватить необязательную часть, если она существует. Как это меняет регулярное выражение?
3. @NoahGoodrich Два числа все еще записываются, если они существуют 😉
Ответ №2:
Вам просто нужно добавить ?
в группу, которую вы хотите сделать необязательной. Это означает «не более одного». Итак, вам понадобится:
'/^(?:float|decimal|double)(((d ),(d )))?/'
Ответ №3:
Попробуйте прочитать данные из таблицы information_schema.columns.
Например:
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_TYPE FROM information_schema.columns;
DATA_TYPE возвращает — decimal
Возвращает значение COLUMN_TYPE — decimal(5,2)
Комментарии:
1. Я не могу полагаться на доступ к прямому чтению INFORMATION_SCHEMA.
2. База данных INFORMATION_SCHEMA всегда доступна.
Ответ №4:
SELECT * FROM mytable WHERE mycolumn REGEXP "^(((float|decimal|double)(\([[:digit:]] ,[[:digit:]] \))?))$";
Это будет соответствовать обоим вашим случаям. Он ожидает либо число с плавающей запятой, десятичное или двойное, либо десятичное число (хотя бы одна цифра, хотя бы одна цифра)
Ответ №5:
Возможно, этот блог может вам помочь!!!
http://qpassablog.blogspot.com.es/2014/02/expresiones-regulares-en-mysql.html
Хорошо, извините за неудобства. Это решение:
Чтобы проверить, является ли значение поля десятичным числом, вы можете использовать следующее выражение
РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ ‘^[[: цифра:]] .{0,1}[[: цифра:]]*$’
Пример: выберите ‘3.222’ REGEXP ‘^[[:digit:]] .{0,1}[[: цифра:]]*$’ как пруэба;
Ответ №6:
База данных INFORMATION_SCHEMA очень полезна, потому что она разбивает информацию. Однако доступ к нему может быть невероятно медленным. На моем веб-хостинге это занимает 95 секунд!