首页 > 解决方案 > SQL 搜索字符串中的 # 字符问题

问题描述

我在 mySQL 搜索查询中使用了一些 Regexp,除非我在查询中有 # 字符,否则它似乎工作正常。

正则表达式基于单词边界进行匹配,因为此查询正在搜索的字段是存储在 SQL 数据库中的整个简历/履历。

例如,这按预期工作并返回正确数量的结果:

SELECT COUNT(*) n FROM candidate c WHERE (c.CV REGEXP '[[:<:]]java[[:>:]]');

但是,当它应该返回几百个时,它不会并返回 0 个结果:

SELECT COUNT(*) n FROM candidate c WHERE (c.CV REGEXP '[[:<:]]c#[[:>:]]');

我现在明白这是因为我根据单词边界进行匹配,而 # 不能是单词的结尾。有趣的是,“C++”可以正常工作。

有没有办法修改这个 REGEXP,使它也适用于像“c#”这样的字符串?

标签: phpmysqlregex

解决方案


你也许可以使用这样的东西:

SELECT 'c#' REGEXP '(^|[^a-zA-Z0-9_])c#($|[^a-zA-Z0-9_])'
SELECT 'java' REGEXP '(^|[^a-zA-Z0-9_])java($|[^a-zA-Z0-9_])'

在较新的 MySQL 版本(8.0.4+)中,通过 ICU 支持正则表达式,而不是 Henry Spencer 的实现,您可以使用\w它看起来更干净:

SELECT 'c#' REGEXP '(^|[^\w])c#($|[^\w])'
SELECT 'java' REGEXP '(^|[^\w])java($|[^\w])'

推荐阅读