码迷,mamicode.com
首页 > 其他好文 > 详细

用正则表达式解决查找指定字符串前一位不能出现xxx,后一位不能出现xxx

时间:2017-07-26 17:32:58      阅读:520      评论:0      收藏:0      [点我收藏+]

标签:字符   划线   项目   说明   解决方案   字符串   简单的   位置   正则表达式   

之前项目要求做一个按指定字符串查找的工具,把所有该字段对应的数据信息都取出来。由于数据量大所以查询结果要求精确匹配(说到这里没有什么难度)。 但是还有一种符合条件的结果是该字段处于一条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的就可以用这种正则表达式来解决了,希望可以帮助更多的人解决同类的问题,不惜勿喷,谢谢!

 

此文为个人原创

             

 

 

用正则表达式解决查找指定字符串前一位不能出现xxx,后一位不能出现xxx

标签:字符   划线   项目   说明   解决方案   字符串   简单的   位置   正则表达式   

原文地址:http://www.cnblogs.com/Sandyspace/p/7239999.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!