Perl 正则表达式学习笔记
什么是正则表达式?
正则表达式是一种字符串匹配的模式,可以用来描述一个字符串的形式。Perl 中有很多内置函数可以支持使用正则表达式,比如 m//、s///、qr//、tr/// 等等。
匹配操作符 m//
在 Perl 中,我们可以使用 m// 操作符来进行字符串的匹配。下面是一个简单的例子:
perlCopy Codemy $str = "hello perl";
if ($str =~ m/perl/) {
print "match found!\n";
}
这个例子中,我们将字符串 "hello perl" 储存在 $str 变量中,并使用 =~ 操作符和 m// 进行匹配。如果匹配成功,则输出 "match found!"。
替换操作符 s///
在 Perl 中,我们可以使用 s/// 操作符来进行字符串的替换。下面是一个简单的例子:
perlCopy Codemy $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 Codemy $str = "Hello Perl";
if ($str =~ m/perl/i) {
print "match found!\n";
}
这个例子中,虽然正则表达式中的 "perl" 是小写的,但是由于使用了 i 修饰符,所以也能够匹配到字符串中的 "Perl"。
元字符
在正则表达式中,有一些特殊的字符被称为元字符,它们具有特殊的含义。以下是一些常用的元字符:
.:匹配任意单个字符。\d:匹配数字。\w:匹配字母、数字和下划线。\s:匹配空白字符。^:匹配字符串的开头。$:匹配字符串的结尾。
例如,我们可以这样来匹配一个邮政编码:
perlCopy Codemy $zipcode = "100101";
if ($zipcode =~ /^\d{6}$/) {
print "valid zipcode\n";
} else {
print "invalid zipcode\n";
}
这个例子中,我们使用了 ^ 和 $ 来匹配字符串的开头和结尾,并使用了 \d{6} 来匹配一个 6 位数字的邮政编码。
常见正则表达式示例
匹配 IP 地址
perlCopy Codemy $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 Codemy $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 Codemy $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 修饰符表示单行模式,即使存在换行符也可以进行匹配。