正则表达式-预查
作者:互联网
参考博客
正则表达式 ?<= 和 ?= 的用法 - 雨中上人 - 博客园
在线正则表达式测试
[\s\S]*?
[\s\S] 意思是匹配所有 空白字符+非空白字符 , 说白了也就是全部字符都可以 * 意思是0个或多个,加个问号为尽量捕捉到更少的字符串
. 表示 匹配除换行符 \n 之外的任何单字符
#都是非捕获,可以穿插|,又叫预查
(?<=左边是):一边是匹配左边界
(?=右边是):匹配右边界
(?:):中间匹配
(?!):右边不匹配
(?<!):左边不匹配
[^#\n]*:尽量用非贪婪模式
[^#\n]*?:一行中,中间不匹配,对于想匹配一行左边或者右边不好用
适合:a[^#/n]*<VirtualHost ,不适合:[^#/n]*<VirtualHost
结论:满足一行中左边不匹配xxx字符
- VirtualHost所在行左边不包含#号
(?<!.*?#.*?)<VirtualHost
<VirtualHost 左边不是(?<!.*?#.*?)
难点-为什么.?[^#/n]?.*?不行
- .?[^#/n]?.*?<VirtualHost
- .?[^#/n]?相当于无,最后的.*?又匹配上了#号
- (?<!.?#.?)来说就是一个整体,所有满足要求
python需要使用regex模块支持零宽断言,re模块不支持
换行符\n
对于读取整个文件之后再匹配,只有一个^和一个$位置
行与行之间多了一个\n
listen runzetoJiangsuZhanghu-prd
bind 0.0.0.0:9999
正则核心是找到又规律的一组数据,或者说上下重复字符为一组,或者成对出现
listen,得有一个参照物
(?<!.*?#.*?)listen[\s\S]*?(?<!.*?#.*?)(?=listen) #匹配非#号开头的listen到非#号开头的结尾
(?<!.*?#.*?)listen[\s\S]*?(?<!.*?#.*?)(?=listen|$)
全文匹配正则的一些用法
(?<!.*?#.*?)listen[\s\S]*?(?<!.*?#.*?)(?=listen|$) #找到listen组
(?<!.*?#.*?)\s*#.* #匹配以#号或空格+#号起始的行,会去掉空行
(?<!.*?#.*?)\s*[\w\d].* #匹配非#号开头,或者开头空格带#号的行,会去掉空行
(?<!.*?#.*?)[\w\d].* #匹配非#号起始的行,且会去掉#号开头的行,及去掉单词前的空格,去掉空行
\n\n #匹配空行
区别(?=与?:)
- (pattern) : 匹配 pattern 并获取这一匹配,所获取的匹配可以从产生的 Matches 集合得到。
- (?:pattern) :匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。
- (?=pattern) :正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?:pattern) 匹配得到的结果包含pattern,(?=pattern) 则不包含。如:
对字符串:"industry abc"的匹配结果:
industr(?:y|ies) ---> "industry" #消耗字符
industr(?=y|ies) ---> "industr" #不消耗字符
标签:字符,匹配,正则表达式,pattern,预查,industr,获取 来源: https://www.cnblogs.com/jinmuqq222/p/14424137.html