松鼠
2018/7/26
本章主要从应用层面更深入的剖析了正则表达式的强大功能,主要使用Perl作为媒介,然需要注意的是,因流派和对正则的支持程度不同,不同语言的风格也迥然不同。Perl对于正则表达式是弱封装的,不需要函数调用控制,基本符号可以直接附加在正则表达式上,而Java等语言则需要对其有更多的控制。
在Perl中,不需要过分注意字符串和正则表达式的区别,在Java、Python中需要明确区分,否则可能会出现歧义。
以下方法适用或仅适用Perl。
思路为重点研究对象,语言只是载体。
-
使用正则表达式匹配文本
在Perl里,使用 ⌈$a =~ m/……/⌋来检查变量a能否匹配两个斜杠之间的正则表达式,需要注意的事,此条是否匹配返回的是Boolean值而非String值。
-
捕获型括号
(……)中成功匹配的文本会被自动记录下来,按照顺序依次储存在$1, $2……中。之后想反向调用直接调用$1即可。
需要注意的是,如果出现括号嵌套,则以左括号为标准,不想要捕获的括号可使用(?:……)声明此括号不在捕获序列里面。
-
使用正则表达式修改文本
在Perl中,使用⌈$a =~ s/regex/replacement/⌋来检查变量a能否匹配两个斜杠之间的正表达式,若能匹配,则把内容替换。
Perl中使用\b表示单词起始和单词结束。
$a =~ s/regex/replacement/g 表示全局替换,每条喜欢规则对所有行都适用。
-
环视(lookaround)
环视匹配的是位置,而非特定的字符,就像行锚点匹配行的开始,环视匹配的多是某类字符的前面或后面位置。
环视的好处在于更精确的寻找特定位置,如:我们想要匹配Jackson中的Jack,我们就应该使用⌈(?=Jackson)Jack⌋。
简单说明一下:首先尝试匹配Jackson,匹配成功后指针会停留在Jackson的J之前,然后在匹配Jack。
环视按照方向,正反可分为四类:
环视名称: |
正则表达式 |
正则表达式成功条件… |
肯定逆序环视 |
(?<=) |
子表达式能够匹配指针左侧文本 |
肯定顺序环视 |
(?=) |
子表达式能够匹配指针右侧文本 |
否定顺序环视 |
(?!) |
子表达式不能够匹配指针右侧文本 |
否定逆序环视 |
(?<!) |
子表达式不能够匹配指针左侧文本 |