2010-09-25 4 views
2

Я хочу сделать матч REGEXP с MySQL от переменной, например, так:Рассматривать целое «слово» буквально с регулярным выражением?

SELECT * 
    FROM table 
WHERE table.CONTENT 
REGEXP CONCAT('([[:space:]]|[[:punct:]])', table.NAME, '([[:space:]]|[[:punct:]])') 

Это прекрасно работает, но это возможно для table.NAME иметь регулярное выражение специальных символов в нем (например, «|»), и в этом случае он все испортится. Существует ли регулярный оператор для обработки целой последовательности символов в буквальном смысле и игнорирования в нем операторов?

Например, если таблица.NAME была «left | right» для одной строки, я бы хотел, чтобы она соответствовала только таблице table.CONTENT буквально имеет в ней строку «left | right». Но если я не могу так или иначе заставить это, MySQL будет видеть это как оператор и искать либо «левый», либо «правый».

+0

Знаете ли вы, что REGEXP медленнее, чем 'LIKE'? Если вы хотите повысить производительность, я бы рекомендовал использовать схему именования, которая не включает специальные символы. –

ответ

0

Ваша строка должна иметь обратную косую черту с символом обратной линии для использования в регулярном выражении. Я не вижу какой-либо функции MySQL специально для экранирования регулярных выражений строк, но вы можете попробовать использовать REPLACE, чтобы добавить обратную косую черту:

REPLACE(table.NAME, '|', '\|') 
+0

Правильно, но это только один оператор. Я должен был сделать это для каждого оператора (.,?, +, * И т. Д.), Чтобы избежать их. Я ищу что-то вроде «^% всех операторов между этими двумя символами обрабатываются как буквенные символы% $ '; Начиная казаться, что его не существует ... – NChase

0

Это хороший вопрос.

Замена специальных символов бесконечен ... так что вы могли бы избежать все в строке

Вы могли бы сделать что-то вроде:

 
DELIMITER // 
DROP FUNCTION myescape; 
CREATE FUNCTION myescape(str varchar(255)) 
    RETURNS TEXT 
    LANGUAGE SQL 
BEGIN 
    DECLARE strLen INT DEFAULT 0; 
    DECLARE i   INT DEFAULT 0; 
    DECLARE newStr varchar(255) DEFAULT ''; 
     SET strLen = LENGTH(str); 

do_this: 
    LOOP 
     SET i = i+1; 
     SET newStr = CONCAT(newStr,'\\',SUBSTRING(str,i,1)); 

    IF strLen = i THEN 
     LEAVE do_this; 
    END IF; 
    END LOOP do_this; 
    RETURN newStr; 
END; 

// 
DELIMITER ; 

Эта функция избежать всех характер вашей строки. Поэтому вы можете вставить его в свой REGEXP.

 
REGEXP CONCAT('([[:space:]]|[[:punct:]])', myescape(table.NAME), '([[:space:]]|[[:punct:]])') 

Сообщите нам, если это ответит на вашу проблему.

Удачи вам в вашем проекте.

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