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

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

此文为个人原创

时间: 2024-10-06 00:46:31

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

Editplus 正则表达式 删除含有指定字符串的行 删除注释

1.删除含有指定字符串的行 替换:  ^.*(指定字符串).*$  为空 例如,删除含有"JOIN"的行, 替换:  ^.*JOIN.*$   为空 2.删除//行注释 替换: //.*$  为空 (需注意,此正则会误删在引号中的'//',  如 'http://www'  ) 3.删除/*...*/段注释 替换: //*.*/n*.*/*/  为空 (需要注意,此正则在Editplus中会有一定的误判,应该是bug,请在替换时单步观察)

在vim中使用查找命令查找指定字符串

要自当前光标位置向上搜索,请使用以下命令:         /pattern   Enter           其中,pattern   表示要搜索的特定字符序列.         要自当前光标位置向下搜索,请使用以下命令:         ?pattern   Enter           按下   Enter   键后,vi   将搜索指定的   pattern,并将光标定位在   pattern   的第一个字符处.例如,要向上搜索   place   一词,请键入:        

21 查找指定字符串

本题要求编写程序,从给定字符串中查找某指定的字符. 输入格式: 输入的第一行是一个待查找的字符.第二行是一个以回车结束的非空字符串(不超过80个字符). 输出格式: 如果找到,在一行内按照格式"index = 下标"输出该字符在字符串中所对应的最大下标(下标从0开始):否则输出"Not Found". 输入样例1: m programming 输出样例1: index = 7 输入样例2: a 1234 输出样例2: Not Found a=input() code

sql server 查找指定字符串的位置

create function fn_find(@find varchar(8000), @str varchar(8000), @n smallint) returns int as begin if @n < 1 return (0) declare @start smallint, @count smallint, @index smallint, @len smallint set @index = charindex(@find, @str) if @index = 0 return

Python CSV 中查找指定字符串

#!/usr/bin/env python# -*- coding: utf-8 -*-import reimport timeimport sysimport csvimport pandas as pdimport numpy as npimport datetimeimport timeimport randomimport requestsimport os############查询是否列表里面已经有MAC分配给了这个SN,有的话直接拿出来上传,无需自加分配##csvFile = op

输出所有形如aabb的4位完全平方数(即前两位数字相等,后两位数字也相等)

计算完全平方根可以使用math库中的sqrt完成,但需要注意以下几点:a取值应为1-9,b取值为0-9:完全平方得到的结果是浮点型,因为浮点型不像整形可能有误差的存在(TODO:浮点型计算误差),可以使用floor(sqrt(x)+0.5)来减小误差,这里稍微展开说下:如果sqrt(x)的结果本来是1,由于浮点计算的误差导致结果为0.9999,那么cast到int型其结果就是0,因此用四舍五入的方式来减少这种误差(这涉及到浮点型的精度问题,如果精度较高的浮点表示,那计算结果于预期的波动会相对较小

正则表达式替换和不包含指定字符串

需求 展示一段文字,段落中有些特殊标记的人名.刊名等,格式大体是:“(作者<刊名>其他)”,某个字段可以为空,比如作者为空. 那么对应的正则大体是这样的   '\((.*?)<(.*?)>.*?\)' 最终的效果是 “(<a>作者</a><<a>刊名</a>>其他)” 第一版 1 class Program 2 { 3 static string str = @"<p>[例]当夫广州之首难,武汉兴师,

40 python 正则表达式 match方法匹配字符串 使用search函数在一个字符串中查找子字

第一课: 使用match方法匹配字符串 # 正则表达式:使用match方法匹配字符串 ''' 正则表达式:是用来处理文本的,将一组类似的字符串进行抽象,形成的文本模式字符串 windows dir *.txt file1.txt file2.txt abc.txt test.doc a-file1.txt-b linux/mac ls 主要是学会正则表达式的5方面的方法 1. match:检测字符串是否匹配正则表达式 2. search:在一个长的字符串中搜索匹配正则表达式的子字符串 3. fi

*字符串-01. 在字符串中查找指定字符

1 /* 2 * Main.c 3 * D1-字符串-01. 在字符串中查找指定字符 4 * Created on: 2014年8月18日 5 * Author: Boomkeeper 6 *****部分通过****** 7 */ 8 9 #include <stdio.h> 10 11 int mysearch(char ch, const char str[], int length) { 12 13 int j, ret = -1; 14 15 for (j = 0; j < le