正则表达式匹配不包含特殊子串的字符串(零宽断言的使用)

简介:

零宽断言的概念可以参考之前的博文

http://cnn237111.blog.51cto.com/2359144/749047

零宽断言,之所以叫零宽,是因为它不消耗字符的,通俗的讲,它不匹配字符串,而是匹配一个位置。比如对于字符串

abcdefg,在正则表达式看来,是下面这个样子的。

p1 a p2 b p3 c p4 d p5 e p6 f p7 g p8 h p9

p1,p2等代表位置,因此8个长度的字符串有9个位置。零宽断言就匹配这些位置。

正则表达式的先行断言和后行断言一共有4种形式: 
(?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion) 
(?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion) 
(?<=pattern) 零宽正向后行断言(zero-width positive lookbehind assertion) 
(?<!pattern) 零宽负向后行断言(zero-width negative lookbehind assertion)

正负只是表示相等还是不相等。

比如在字符串

A community is a place where communication and understanding happens中,要匹配后面是字母t,但t后面的必须不是原音字母aeiou的。那么如果写成这种写法:t[^aeiou],那么还是会把t后面的字符也匹配进来。

7B454863686547E0B0C98B6BAA0956C7

如果使用零宽断言的话,就可以解决这个问题。

正则表达式t(?=[^aeiou]) 或者t(?![aeiou])都匹配t和一个位置。

8A47FC4F3A1B4A22ADCB1936378E0717

D8D2AA1FB1674FC58C3F6CE295306D12

那么比如匹配不包含字符串ab的行写法就应该如下:

先写下(?!ab),意思是匹配一个位置,该位置后面没有ab,然后写出(?!ab).,意思就是该位置后面可以跟任何一个字符(除了ab),但这个正则表达式只匹配单个字符,因此该模式匹配某个位置后的单个字符,该字符是a且后面是b,则该字符就得不到匹配。因此对于多个字符只要把该字符分组捕获后加上*即可,因此最终的正则表达式为

((?!ab).)*

如果匹配不包含ab的某一行的话

就是如下写法

^((?!ab).)*$

775889B78C6042B79BC1BCE1E82E680C














本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/1003376,如需转载请自行联系原作者


相关文章
|
1月前
|
JavaScript 前端开发
JavaScript随手笔记 --- 用正则表达式匹配字符串是否为运算公式
JavaScript随手笔记 --- 用正则表达式匹配字符串是否为运算公式
|
5月前
|
Python
133 python高级 - 正则表达式(原始字符串)
133 python高级 - 正则表达式(原始字符串)
29 0
|
6月前
|
C++
使用 ABAP 正则表达式提高字符串解析的执行效率
使用 ABAP 正则表达式提高字符串解析的执行效率
60 0
|
7月前
|
程序员
用正则表达式判断字符串形式正误(例:判断电话号码属地是否为中国大陆)
用正则表达式判断字符串形式正误(例:判断电话号码属地是否为中国大陆)
44 0
|
1月前
|
Linux Perl
使用awk和正则表达式过滤文本或字符串 - 详细指南和示例
使用awk和正则表达式过滤文本或字符串 - 详细指南和示例
64 0
|
4月前
|
算法
【面试算法——动态规划 21】正则表达式匹配(hard)&& 交错字符串
【面试算法——动态规划 21】正则表达式匹配(hard)&& 交错字符串
|
4月前
通过正则表达式获取字符串中的省市区
通过正则表达式获取字符串中的省市区
52 0
通过正则表达式获取字符串中的省市区
|
4月前
|
Java
每日一刷《剑指offer》字符串篇之正则表达式匹配
每日一刷《剑指offer》字符串篇之正则表达式匹配
51 0
每日一刷《剑指offer》字符串篇之正则表达式匹配
|
8月前
|
Python
【从零学习python 】62. Python正则表达式:强大的字符串匹配工具
【从零学习python 】62. Python正则表达式:强大的字符串匹配工具
40 0

热门文章

最新文章