Sharplook夏洛克作为专业的日志采集分析系统,涉及的技术点,从后到前着实不少,内容也较为复杂。正则作为日志解析的手段,起着举足轻重的作用,在此小生将晦涩难懂的内容,拆解出来以便学习之用。
往期回顾
在上一篇文章中,我们已经学习了正则表达式的字符匹配,介绍了模糊匹配、字符组和量词。正则表达式就是匹配模式,要么匹配字符,要么匹配位置,牢记这个基准。本章小生将介绍位置匹配,将分成以下内容进行介绍:
位置的定义
位置可以理解为字符之间的位置,也可以称为锚点。如图,箭头所指的位置:
如何匹配位置
在ES5中,共有6个锚:^ 、$ 、b 、B 、(?=p) 、(?!p)
^$bB(?=a)(?!b) 其可视化的形式如下:其可视化的形式如下:
^ 和 $
^ (脱字符)匹配开头的位置,在多行匹配中匹配行开头。
$ (美元符)匹配结尾的位置,在多行匹配中匹配行结尾。
比如我们把字符串的开头和结尾替换为# ,就是将位置替换为字符:
let result = 'lemon'.replace(/^|$/g,'#');
console.log(result);
// => #lemon#
多行匹配模式(增加修饰符 m )时,此是行的概念,这一点需要我们注意:
let result = 'Inlovenjavascript'.replace(/$|^/gm,'#');
console.log(result);
/*
#I#
#love#
#javascript#
*/
b 和 B
b 是单词边界符,具体为w 与 W 之间的位置,也包括w 与 ^ 之间的位置,和w 和 $ 之间的位置。
比如,我们通过字符串替换字符串中的b 位置为# 来进行分析:
let result = '[JS] Lesson_01.mp4'.replace(/b/g,'#');
console.log(result);
// => [#JS#] #Lesson_01#.#mp4#
具体怎么匹配成这样的? 接下来我们慢慢来分析。
首先我们需要知道,w 是字符组 [a-zA-Z0-9_] 的简写,也就是w 是字母、数字和下划线中的任何一个。而 W 是排除字符组 [^a-zA-Z0-9_] 的简写形式,即W 是 w 以外的任何一个字符。
我们再来看我们的结果[#JS#] #Lesson_01#.#mp4# 中的每一个# 的由来:
- 第一个,两边字符是
[ 和 J ,是 W 与 w 之间的位置。
- 第二个,两边字符是
S 与 ] ,是 w 与 W 之间的位置。
- 第三个,两边字符是空格与
L ,是 W 与 w 之间的位置。
- 第四个,两边字符是
1 与 . ,是 w 与 W 之间的位置。
- 第五个,两边字符是
. 与 m ,是 W 与 w 之间的位置。
- 第六个,位于结尾,前面的字符
4 是 w ,即 w 与 $ 之间的位置。
知道了 b 的概念之后,接下来 B 就很好理解了。B 就是 b 的反面意思,非单词边界,例如上例子中除去 b 的位置之外,余下的就都是 B 的位置了。具体来说就是 w 与 w 、 W 与 W 、^ 与 W 、W 与 $ 之间的位置。
比如,上例子中,把所有 B 替换成 # :
let result = '[JS] Lesson_01.mp4'.replace(/B/g,'#');
console.log(result);
// => #[J#S]# L[/!--empirenews.page--]s#s#o#n#_#0#1.m (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|