Perl 正则表达式学习笔记

什么是正则表达式?

正则表达式是一种字符串匹配的模式,可以用来描述一个字符串的形式。Perl 中有很多内置函数可以支持使用正则表达式,比如 m//s///qr//tr/// 等等。

匹配操作符 m//

在 Perl 中,我们可以使用 m// 操作符来进行字符串的匹配。下面是一个简单的例子:

perlCopy Code
my $str = "hello perl"; if ($str =~ m/perl/) { print "match found!\n"; }

这个例子中,我们将字符串 "hello perl" 储存在 $str 变量中,并使用 =~ 操作符和 m// 进行匹配。如果匹配成功,则输出 "match found!"

替换操作符 s///

在 Perl 中,我们可以使用 s/// 操作符来进行字符串的替换。下面是一个简单的例子:

perlCopy Code
my $str = "hello perl"; $str =~ s/perl/Python/; print $str, "\n";

这个例子中,我们将字符串 "hello perl" 储存在 $str 变量中,并使用 s/// 将其中的 "perl" 替换成 "Python"。最后输出的字符串应该是 "hello Python"

匹配模式修饰符

m//s/// 中,我们可以使用模式修饰符来改变正则表达式的匹配行为。下面是一些常用的模式修饰符:

  • i:忽略大小写。
  • m:多行匹配。
  • s:将字符串视为单行,即使其中有换行符。
  • x:允许使用空白符和注释。

例如,我们可以这样来忽略大小写地匹配一个字符串:

perlCopy Code
my $str = "Hello Perl"; if ($str =~ m/perl/i) { print "match found!\n"; }

这个例子中,虽然正则表达式中的 "perl" 是小写的,但是由于使用了 i 修饰符,所以也能够匹配到字符串中的 "Perl"

元字符

在正则表达式中,有一些特殊的字符被称为元字符,它们具有特殊的含义。以下是一些常用的元字符:

  • .:匹配任意单个字符。
  • \d:匹配数字。
  • \w:匹配字母、数字和下划线。
  • \s:匹配空白字符。
  • ^:匹配字符串的开头。
  • $:匹配字符串的结尾。

例如,我们可以这样来匹配一个邮政编码:

perlCopy Code
my $zipcode = "100101"; if ($zipcode =~ /^\d{6}$/) { print "valid zipcode\n"; } else { print "invalid zipcode\n"; }

这个例子中,我们使用了 ^$ 来匹配字符串的开头和结尾,并使用了 \d{6} 来匹配一个 6 位数字的邮政编码。

常见正则表达式示例

匹配 IP 地址

perlCopy Code
my $ip = "192.168.1.1"; if ($ip =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) { print "valid IP address\n"; } else { print "invalid IP address\n"; }

这个例子中,我们使用了一个正则表达式来匹配一个 IP 地址。其中,^$ 分别表示字符串的开头和结尾,\d+ 表示匹配一个或多个数字,\. 表示匹配一个点号,并使用括号来将每个部分的数字捕获到一个变量中。

匹配邮箱地址

perlCopy Code
my $email = "abc123@example.com"; if ($email =~ /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/) { print "valid email address\n"; } else { print "invalid email address\n"; }

这个例子中,我们使用了一个正则表达式来匹配一个邮箱地址。其中,[a-zA-Z0-9._%+-] 表示匹配字母、数字、点号、下划线、百分号、加号和减号,[a-zA-Z0-9.-]+ 表示匹配字母、数字、点号和减号,并且必须至少匹配一次,\. 表示匹配一个点号,[a-zA-Z]{2,} 表示匹配至少两个字母,并且没有上限。

匹配 HTML 标签

perlCopy Code
my $html = "<p>Hello, Perl!</p>"; if ($html =~ /<(\w+)>.*<\/\1>/s) { print "valid HTML tag\n"; } else { print "invalid HTML tag\n"; }

这个例子中,我们使用了一个正则表达式来匹配一个 HTML 标签。其中,<(\w+)> 表示匹配一个起始标签,并将标签名捕获到一个变量中,.* 表示匹配任意数量的字符(包括换行符),<\/\1> 表示匹配一个结束标签,其中 \1 表示引用第一个括号中捕获到的标签名。最后的 /s 修饰符表示单行模式,即使存在换行符也可以进行匹配。