参考博客
正则表达式 ?<= 和 ?= 的用法 - 雨中上人 - 博客园
在线正则表达式测试
[\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 #匹配空行