【问题标题】:Treat a whole "word" literally with regular expression?用正则表达式逐字处理整个“单词”?
【发布时间】:2011-04-17 01:16:10
【问题描述】:

我想用 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 会将其视为运算符并查找“左”或“右”。

【问题讨论】:

  • 您知道 REGEXP 比 LIKE 慢吗?如果您想要更好的性能,我建议使用不涉及特殊字符的命名方案。

标签: mysql regex


【解决方案1】:

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

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

【讨论】:

  • 对,但这只是一个运算符。我不得不对每个运算符(.、?、+、* 等)进行替换以逃避它们。我正在寻找类似'^%这两个符号之间的所有运算符都被视为文字字符%$'之类的东西;开始好像不存在了……
【解决方案2】:

这是个好问题。

替换特殊字符是无穷无尽的......所以你可以逃避字符串中的所有内容

你可以这样做:

分隔符 // 拖放功能 myescape; 创建函数 myescape(str varchar(255)) 返回文本 语言 SQL 开始 DECLARE strLen INT DEFAULT 0; DECLARE i INT DEFAULT 0; DECLARE newStr varchar(255) DEFAULT ''; 设置 strLen = 长度(str); 做这个: 环形 设置 i = i+1; SET newStr = CONCAT(newStr,'\\',SUBSTRING(str,i,1)); 如果 strLen = i 那么 离开 do_this; 万一; 结束循环do_this; 返回 newStr; 结尾; // 分隔符;

此函数转义字符串的所有字符。所以你可以将它插入到你的正则表达式中。

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

如果它回答了您的问题,请告诉我们。

祝你的项目好运。

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 2021-12-30
    • 2012-01-06
    • 2011-11-19
    相关资源
    最近更新 更多