我正在研究遗留软件,在过去的十年中,这个软件并没有开玩笑,已经有十多个人在使用它。看起来很棒。
我现在遇到的问题是某些记录包含“舞蹈规则”的字符串,而不是记录ID。太多的其他代码依赖于这些字符串作为字符串让我改变这一点。我不想在包含ID代码的表中添加新字段,然后我必须不断地与文本字段相关联。我想离开桌子,直到他们给我完全控制项目,让我扔掉它重新开始。
问题在于:我们目前有四条舞蹈规则:
这些规则保存在除法类型表的“dance_rules”字段中的VARCHAR字段中。此字段的内容已预先格式化以显示:
不,这些不是唯一的组合。
我的问题在于寻找“嘻哈”,而不是“扩大嘻哈”。我在StackOverFlow上看到了其他响应,它们展示了如何使用正则表达式匹配子串,但只搜索“Hip Hop”将始终匹配“Expanded Hip Hop”。
使用上面的例子,搜索“Hip Hop”应该找到1,2和5,但不能找到3或4.解决方案显然需要引用逗号和符号,但这些只有一个列表中的单个项目。我刚刚为代码的这个方面添加了一个添加/编辑/删除功能(这个功能已经奇怪地丢失了十年),所以我不能再依赖于相同顺序的值了。
答案 0 :(得分:3)
你应该可以使用:
(^|[,&] )Hip
符合该要求,或者Hip
有多种类型:
(^|[,&] )Hip Hop
如果列的开头有Hip
,或者列Hip
后跟&
或,
,则会匹配。
SQL用法:
select id from dance where class regexp '(^|[,&] )Hip'
Regex101演示:https://regex101.com/r/8uY57D/1
最后让SQLFiddle执行:http://sqlfiddle.com/#!9/5f94bb/1
此处有关于角色类的信息,http://www.regular-expressions.info/charclass.html。
答案 1 :(得分:2)
试试这个正则表达式。它涵盖了您的测试用例,以及任何" Hip Hop"在开头或之前是逗号或符号。
set @regexp1 = '^Hip Hop|(,|&) Hip Hop';
Execute:
> select 'Hip Hop' regexp @regexp1
+ ------------------------------ +
| 'Hip Hop' regexp @regexp1 |
+ ------------------------------ +
| 1 |
+ ------------------------------ +
1 rows
Execute:
> select 'Co-ed & Hip Hop' regexp @regexp1
+ -------------------------------------- +
| 'Co-ed & Hip Hop' regexp @regexp1 |
+ -------------------------------------- +
| 1 |
+ -------------------------------------- +
1 rows
Execute:
> select 'Extended Hip Hop' regexp @regexp1
+ --------------------------------------- +
| 'Extended Hip Hop' regexp @regexp1 |
+ --------------------------------------- +
| 0 |
+ --------------------------------------- +
1 rows
Execute:
> select 'Prep & Expanded Hip Hop' regexp @regexp1
+ ---------------------------------------------- +
| 'Prep & Expanded Hip Hop' regexp @regexp1 |
+ ---------------------------------------------- +
| 0 |
+ ---------------------------------------------- +
1 rows
Execute:
> select 'Co-ed, Hip Hop & Expanded Hip Hop' regexp @regexp1
+ -------------------------------------------------------- +
| 'Co-ed, Hip Hop & Expanded Hip Hop' regexp @regexp1 |
+ -------------------------------------------------------- +
| 1 |
+ -------------------------------------------------------- +
1 rows