2013-04-11 5 views
3

Хорошо, у меня уже были некоторые кошмары, поэтому я склоняю свою тупую голову всемогущему улью-разуму Stackoverflow.Mysql regex alphanumerical с некоторыми специальными символами

UPD: параметры моей задачи изменены. Мне нужно найти коды, которые могут включать специальные символы, такие как круглые скобки() и/или @, #, &, $.

Так коды могут выглядеть следующим образом:

"А", "Bb", "2C8", "A7 (BO) 19", B29H $, 29H (6JI) 0 # и т.д.

Проблема в том, что все эти коды являются необязательными. Я попытался как Barmar (см ответ 1) предложил, но немного необходимости модифицировать запрос MySQL:

SELECT * 
FROM table 
WHERE column REGEXP '^[a-z0-9\@\#\$\&()]*$' 
AND column LIKE CONCAT('%', '$v', '%') 

Он не может вернуть меня "S (LJ) 9" или "09S (LJ) 3 $", если я искать для «SLJ» или «S (LJ)»

Ну, в стороне от некоторой реальной важной нуклеотидной последовательности в моей ДНК, которая позволила бы мне эффективнее (или иметь их) использовать мозги, чего мне не хватает в этом регулярном выражении или запросить себя? Спасибо всем заранее.

+0

Являются ли символы, которые пользователь вводит __required__, должны быть в значении? – Barmar

ответ

2
SELECT * 
FROM table 
WHERE column REGEXP '^[a-z0-9()]*$' /* code contains alphanumerics and parentheses */ 
AND column NOT REGEXP '[0-9]{3}' /* code does not contain >2 digits in a row */ 
AND column LIKE CONCAT('%', ?, '%') /* code contains the user input */ 

где? связан с пользовательским вводом (вы должны использовать подготовленные инструкции PDO или mysqli).

+0

Спасибо, Бармар! Пользователь может вводить до 5 кодов, и их можно случайным образом встретить в 5 колонах. Логика заключается в поиске строк, где все коды могут быть найдены в любом из конкретных столбцов: 'SELECT * FROM table WHERE ID IN (SELECT ID FROM table WHERE (((col0 REGEXP '^ [\ w()] * $' И col0 LIKE CONCAT ('%', '$ v', '%')) ИЛИ ... ИЛИ (col4 REGEXP '^ [\ w()] * $' AND col4 LIKE CONCAT ('%', '$ v ','% '))) AND ... AND ((col0 REGEXP'^[\ w()] * $ 'И col0 LIKE CONCAT ('% ',' $ v5 ','% ')) ИЛИ .. OR (col4 REGEXP '^ [\ w()] * $' И col4 LIKE CONCAT ('%', '$ v5', '%')))) и othercol NOT NOT) 'Он печально ничего не возвращает – Rhiozan

+0

Mysql не имеет escape-последовательностей '\ w' и' \ d' regexp, я изменил свой ответ, чтобы расширить их. Попробуйте эту форму. – Barmar

+0

Еще раз спасибо, Бармар. После последнего обновления вашего решения он работает достаточно хорошо. К сожалению, проект, с которым работает, очень чувствителен к такому поиску в дБ. Я попытаюсь освоить искусство регулярного выражения :) – Rhiozan

Смежные вопросы