用正则表达式对待整个“单词”?

时间:2010-09-25 00:17:12

标签: mysql regex

我想针对变量与MySQL进行REGEXP匹配,如下所示:

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

这样可以正常工作,但table.NAME可能会在其中包含正则表达式特殊字符(例如“|”),在这种情况下,它会被搞砸。是否有正则表达式运算符从字面上处理整个字符序列并忽略其中的运算符?

例如,如果table.NAME对于一行是'left | right',我希望它只匹配,如果table.CONTENT字面上有字符串'left | right'。但是除非我能以某种方式强迫它,否则MySQL会将其视为运算符并寻找“左”或“右”。

2 个答案:

答案 0 :(得分:0)

您的字符串应具有反斜杠转义的管道符,以便在正则表达式中使用。我没有看到任何专门用于转义正则表达式字符串的mysql函数,但您可以尝试使用REPLACE添加反斜杠:

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

答案 1 :(得分: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:]])')

告诉我们它是否解决了您的问题。

祝你的项目好运。

相关问题