工作中经常用到正则运算,而特殊场景下需要匹配排除某个特点字段进行匹配,下面是目前遇到的几种排除运算
首先要确认两个概念:前瞻、前瞻
表达式 | 名称 | 描述 |
(?=exp) | 正向前瞻 | 匹配后面满足表达式exp的位置 |
(?!exp) | 负向前瞻 | 匹配后面不满足表达式exp的位置 |
(?<=exp) | 正向后瞻 | 匹配前面满足表达式exp的位置 |
(?<!exp) | 负向后瞻 | 匹配前面不满足表达式exp的位置 |
看起来挺抽象的,其实可以简单理解为以某个字段往前(往后)看一下是否包含(不包含)某个字段
// 以H为基准往后看,是否紧跟着i字段
/H(?=i)/g.test('Hi')
// 以H为基准往后看,是否不紧跟着i字段
/H(?!i)/g.test('Hi')
// 以H为基准往前看,是否紧跟着i字段
/(?<=i)H/g.test('iH')
// 以H为基准往前看,是否不紧跟着i字段
/(?<!i)H/g.test('Hi')
1、查找不以某个字符(比如helloword)开头的字符串
正则:/^(?!helloword).*$/
这种比较简单,就是查找开头不是helloword的字段,这种就是负向前瞻,开头往后看不包含helloword
2.查找不以某个字符(比如helloword)结尾的字符串
正则:/^.*(?<!helloword)$/
这种不是很常见,因为用到了负向后瞻,以结尾往后看不包含helloword
3.查找不包含某个字符(比如helloword)的字符串
正则:/^(?!.*helloworld).*$/
这种就比较麻烦了,可以看出1和3比较相像,只是比1的hellowold之前加了.*字段
我们可以理解为不以XXXXXhelloword为开头的字段,这种就排除了helloword存在中间或结尾的情况
4.查找指定字符之间不包含某个字符(比如helloword)的字符串
正则:/A((?!helloword).)+B/
拆解来看,先把负向前瞻拿掉
/A(.)+B/,A和B之间可以加任何数据,加上前瞻就是A和B之间可以加除了helloword的任意数据