之前项目要求做一个按指定字符串查找的工具,把所有该字段对应的数据信息都取出来。由于数据量大所以查询结果要求精确匹配(说到这里没有什么难度)。 但是还有一种符合条件的结果是该字段处于一条sql语句中,简单的说,就是一个长得字符串里包含了要查询的字段,那么要求来了。
1, 必须找出精确匹配要求的字符串的查询结果,包括完全相同结果和长字符串中精确匹配的结果
2, 长字符串中的字符串有可能含有&xxx,或者&&xxx 也是符合条件的,因为他们实际指的是同一个字符串。
看起来很乱,举个例子就能说明白了
比如,我要查询的字符串是abc,在我查询的数据里有
1,abc 对应的数据信息, 满足条件
2,xxx abc ....对应的数据, 满足条件
3,xxx &abc ....对应的数据, 满足条件
4,xxx &&abc....对应的数据, 满足条件
5,xxx &&abc)....对应的数据, 满足条件
6,xxx &&abc,....对应的数据, 满足条件
7,xxx (&&abc....对应的数据, 满足条件
8,xxx ,&&abc....对应的数据, 满足条件
8,xxx , px.abc....对应的数据, 满足条件
等等,总之就在长得字符串中,abc || &abc || &&abc 的前后不是字母、数字 或者下划线, 不构成一个新的变量名,就可以认为满足条件了
解决方案:
使用正则表达式来匹配筛选条件,普通的正则表达式已不能满足要求,经过深入学习了正则表达式之后,发现了两个正则表达式的用法:
1,零宽度正预测先行断言
语法:(?=exp)匹配exp表达式前面的位置。
在我的要求里,abc前面一位不能是字母、数字、下划线, 所以应该写为\W(?=abc), 由于还要精确匹配 abc,所以修改为 \b\W?(?=abc)\b, 到现在还不能满足要求。
2,零宽度负向预测先行断言
语法:(?!exp)匹配后面跟的不是exp的位置。
abc 后一位同样也不能是字母、数字、下划线,所以用此语法写出来应该是\b(?!\w)\b
最后就是要实现查找一个字符串前后不能出现字母、数字、下划线的一条正则表达式,将前面两条组装起来就是 \b\W?(?=abc)abc(?!\w)\b,虽然在测试时发现对于a&abc 这样的数据不能过滤掉,但是在我们项目中的数据没有这种类型的,所以完美匹配查询结果。
针对这种指定字符串前不能出现xxx, 字符串后不能出现xxx的就可以用这种正则表达式来解决了,希望可以帮助更多的人解决同类的问题,不惜勿喷,谢谢!