php - 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#”这样的字符串?
解决方案
你也许可以使用这样的东西:
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])'
推荐阅读
- python - css 更改不会反映我在 localhost 上的项目
- java - 比较字谜字符串时输出错误
- python - 从列表中删除 UTF-8 字符
- ios - ARKit – 是否可以在 ARSession 暂停时添加 SCNNode?
- typescript - 类型参数不可分配给“字符串”类型的参数
- c# - 将动态对象类型转换为 C# 中传入参数的类类型
- plotly - plotly 默认使用哪个端口?
- docker - 如何使用 Docker Compose 而不在每次进行更改时重新构建镜像?
- javascript - 在 JavScript 类中使用原型存储属性而不是 getter
- spring - 从 PUT 方法处理程序中链接@Exceptionhandler 的最佳方法?