正则表达式-预查

参考博客

正则表达式 ?<= 和 ?= 的用法 - 雨中上人 - 博客园
在线正则表达式测试

[\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                 #匹配空行
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容