面向正则表达式编程的Perl

单个查找替换效率低下,于是就想着是否有方便的工具,但是不想使用 $Python$,就考虑到 $Perl$,虽然 $Perl$ 相对来说古怪一些,但是在接触以后,发现它还是很强大的,而且充满了乐趣。以下作为学习 $Perl$ 中的 $RegEx$ 的一些记录。
什么是正则表达式
A regular expression, regex or regexp (sometimes called a rational expression)is a sequence of characters that define a search pattern. Usually such patterns are used by string searching algorithms for “find” or “find and replace” operations on strings, or for input validation. It is a technique developed in theoretical computer science and formal language theory.
以上是WiKipedia上的定义,也就是说正则表达式是一种特殊的字符序列,可以用来定义如何搜索匹配样本。
在 Perl 中,通常使用 / / 来界定匹配样本(实际上是 m//, m通常可以省略 )。
| 1 | /ab/ # 表示匹配 ab 字符串 | 
但是如果在匹配源中本身就存在 /字符时,整个匹配样本就显得难以区分。
| 1 | /http:\/\// # \字符用于转义 /字符 | 
实际上Perl对 / / 并不做硬性的要求,因此只要是使用成对的定界符即可,比如
| 1 | m%http:\/\/% or m{http:\/\/} | 
这些都可以达到一样的效果。
如何对特定变量进行正则匹配呢?这时就需要使用捆绑操作符(the binding operator )=~ 。
| 1 | my $one_url = "https://maxximues.github.io"; | 
^表示从头开始匹配
捷径—方便用于正则匹配中的”记号”
- . —用于匹配任意单个字符,除新的一行以外。 - 1 - /ab.a/ # 可以用于匹配 abaa,abba.... 
- 重复词Quantifiers 
| Number to match | Metacharacter | Generalized form | 
|---|---|---|
| Optional | ? | {0,1} | 
| Zero or more | * | {0,} | 
| One or more | + | {1,} | 
| Minimum or more | {min,} | |
| Minimum with maximum | {min,max} | |
| Exactly | {exactly_number} | 
| 1 | /abb?a/ # 匹配 abba 或者 aba | 
重复词只能将它最邻近字符重复匹配。
- 分组Group
如何将特定字段重复匹配呢?使用 () 将需要可能重复的字段囊括起来。
| 1 | /fred{1,2}/ # 匹配 fred,fredd | 
且根据括号使用的先后,可以使用\num,来代表这组匹配,num表示第几个出现的括号
| 1 | use v5.10; | 

当括号使用次数很多时,使用 \num 这种方式就很容易出错,所以在v5.10版本后,可以使用 \g{num} 来清楚指定第几个括号中的内容,且不容和匹配源中的文字产生歧义。
| 1 | /(.)\111/ # 这时就会产生歧义,\1 \11 \111 这三个都可能是 | 
- 可选词Alternatives - 1 - /fred|barney/ 
- 字符类Character Classes - 1 
 2
 3
 4- /[a-z]/ # 表示一个小写字母 a-z 的匹配 
 /[A-Z]/ # 表示一个大写字母 A-Z 的匹配
 /[0-9]/ # 表示一个数字 0-9 的匹配
 /[A-Z]+/ # 表示大写字母 A-Z 的匹配
事实上在使用时这些也有一些简便方法
| 1 | /[0-9]/ == /\d/ # decimal digits | 
- 定位开头末尾的”锚”Anchors1 /^w{3}\.(\w)+@(\w)+\.com(\.cn)?$/ # ^表示字符串开头匹配,$表示字符串末尾匹配,整体匹配一个邮箱 

在Perl 5中,也可以使用 \A 和 \Z来分别表示开头和末尾。