怎么学习正则表达式——轻松学会让人眼花的正则表达式
本文利用之前的案例数据访问日志数据进行分析。
日志文件的格式主体上是以单个空格来分割的,理论上可以以空格来将他进行分割,但是有一些数据里面自带了空格,所以我们就不能单纯的以文本分割的形式来对他进行分割。所以使用正则表达式来对数据进行分割。
定义:
正则表达式描述了一种字符串的匹配模式,可以用来检查一个串是否含有某种子串,将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
正则表达式字符说明:
百讲不如一练,看例题
例如利用正则表达式来对这一条日志进行数据提取。
日志数据:
314 116.227.136.48 - - [21/Aug/2017:23:59:12 +0800] “POST /study/updateDurationVideo.mooc HTTP/1.1” 200 2 “http://www.chinamoocs.com/study/initplay/602.mooc” “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36”
我们先把这条数据进行分解,由于他的每一条属性都是以空格进行分割的,分割后得到以下多条属性。我们对每条属性进行详细说明。
314 :代表这条数据的序号,也就是id
116.227.136.48:代表IP地址
“- -”:无意义数据,丢弃
[21/Aug/2017:23:59:12 +0800] :代表访问时间
"POST /study/updateDurationVideo.mooc HTTP/1.1" :代表访问链接
200:代表访问状态码
2:传输字节数
"http://www.chinamoocs.com/study/initplay/602.mooc" :访问来源
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36":客户端信息
用这条语句来提取 regexp_substr(content, ’ [ [ ] .? [ ] ] | " .? " | .*? ‘, 1, 1), ’ $’, ’ ')
表达式说明:
[ [ ] .*? [ ] ] : 表示括号里的字符取原来的意思,这里的括号相当于转义字符。这里取得就是
以 “[” 开头到 “]” 结尾的内容。" . “代表任意字符,” * “代表零次或多次,” ?"代表非贪婪模式获取。这里取的属性就是 [ ] 里的属性。
" .*? " :这里取的属性就是“引号”里的数据。
.*? :既不是括号,也不是引号的就用这种方式提取。
" | ":代表“或者”的意思,这里一共有三组匹配模式,取到其中任意一种即可。
1, 1:第一个1表示从第一个字符开始使用正则表达式,第二个1表示匹配到字符的次数,这里表示取第一次匹配到的值。第一次匹配到的值为 314 。所以匹配到了id。
’ $’, ’ ’ :将’ $‘替换为’ ’ ,就是一个去末尾空格的操作。
这是这段正则表达式含义。
提取数据:
regexp_substr(content, ’ [ [ ] .? [ ] ] | " .? " | .*? ‘, 1, 1), ’ $’, ’ ')
当参数为1的时候匹配到的值为id。
regexp_substr(content, ’ [ [ ] .? [ ] ] | " .? " | .*? ‘, 1, 2), ’ $’, ’ ')
当参数为2的时候匹配到的值为ip地址
regexp_substr(content, ’ [ [ ] .? [ ] ] | " .? " | .*? ‘, 1, 3), ’ $’, ’ ')
当参数为3的时候匹配到的值为“—”。数据无用,舍弃。
regexp_substr(content, ’ [ [ ] .? [ ] ] | " .? " | .*? ‘, 1, 4), ’ $’, ’ ')
当参数为4的时候匹配到的值为“—”。数据无用,舍弃。
regexp_substr(content, ’ [ [ ] .? [ ] ] | " .? " | .*? ‘, 1, 5), ’ ^ [ [ ] | [ ] ] $’, ’ ')
当参数为5的时候匹配到的值为【】里的内容,也就是访问时间。这里需要将符号【】转换为空格,进行去空格操作。
regexp_substr(content, ’ [ [ ] .? [ ] ] | " .? " | .*? ‘, 1, 6), ’ ^" | " $’, ’ ')
当参数为6的时候匹配到的值为访问链接。这里需要将 " " 转换为空格,进行去空格操作。
regexp_substr(content, ’ [ [ ] .? [ ] ] | " .? " | .*? ‘, 1, 7), ’ $’, ’ ')
当参数为7的时候匹配到的值为访问状态码。
regexp_substr(content, ’ [ [ ] .? [ ] ] | " .? " | .*? ‘, 1, 8), ’ $’, ’ ')
当参数为8的时候匹配到的值为传输字节数。
regexp_substr(content, ’ [ [ ] .? [ ] ] | " .? " | .*? ‘, 1, 9), ’ ^" | " $’, ’ ')
当参数为9的时候匹配到的值为访问来源。这里需要将 " " 转换为空格,进行去空格操作。
regexp_substr(content, ’ " .*?" ‘, 1, 3), ’ ^" | " $’, ’ ')
由于最后一段数据末尾没有空格,所以我们要用匹配到 " " 里的第三次的内容来提取他。所以提取方式要 为 " " 引号里的,且匹配次数为第三次的数据。
到这里就可以完整的提取出日志文件里的所有属性了。没看懂的建议把数据用不同的颜色标出来,将表达式带入到数据里面对比着看,虽然看起来很多符号,但是分解开来就是很简单的东西。