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
修饰符表示单行模式,即使存在换行符也可以进行匹配。