正则表达式入门
匹配单个字符
- 匹配单个字符:直接写出字符本身,或者通配符
通配符
.
:代表匹配任何一个字符,除了回车换行[]
:都是或的关系
[^asd]
:除了asd之外的都被匹配[a-z]
:匹配所有小写字符[A-Z]
:匹配所有大写字符[0-9]
:匹配所有数字
匹配简写
- \w:所有单词字符
- \d:所有数字
- \s:空白字符(包括制表符和空格)
匹配多个字符
a*
:表示匹配0个a或者n个a
(*
的具体含义是匹配0个到n个前一个字符)
a+
:+ 代表匹配1个或n个前一个字符a?
:?代表匹配0个或1个前一个字符
*+?
只能匹配前一个字符,出现在一起肯定是错误的正则表达式
a{2}
:匹配两个aa{2,}
:匹配两个以上aa{2,4}
:匹配2-4个a
提取内容
以一个时间戳为例子
接下来提取年月日时分秒
嵌套的括号
其他
括号可以把括号内的内容当作一个整体
匹配n个helloworld
a*
是贪婪的(会尽可能多的匹配)
解决办法:
a.*?a
:尽可能匹配少的内容
一个pattern匹配多个内容
字符边界控制符
- 匹配空白行
^代表行首,$代表行尾
例子(Nginx日志提取字段)
93.180.71.3 - - [17/May/2015:08:05:32 +0000] "GET /downloads/product_1 HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)"
93.180.71.3 - - [17/May/2015:08:05:23 +0000] "GET /downloads/product_1 HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)"
80.91.33.133 - - [17/May/2015:08:05:24 +0000] "GET /downloads/product_1 HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.17)"
217.168.17.5 - - [17/May/2015:08:05:34 +0000] "GET /downloads/product_1 HTTP/1.1" 200 490 "-" "Debian APT-HTTP/1.3 (0.8.10.3)"
217.168.17.5 - - [17/May/2015:08:05:09 +0000] "GET /downloads/product_2 HTTP/1.1" 200 490 "-" "Debian APT-HTTP/1.3 (0.8.10.3)"
93.180.71.3 - - [17/May/2015:08:05:57 +0000] "GET /downloads/product_1 HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)"