快速入门
教程
工具和语言
示例
参考
书评
正则表达式工具
grep
PowerGREP
RegexBuddy
RegexMagic
通用应用程序
EditPad Lite
EditPad Pro
语言和库
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery 和 XPath
XRegExp
数据库
MySQL
Oracle
PostgreSQL
本网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书评
可打印 PDF
关于本网站
RSS 源和博客
RegexBuddy—The best regex editor and tester for Perl developers!

Perl 对正则表达式的丰富支持

Perl 最初由 Larry Wall 设计,作为一种灵活的文本处理语言。多年来,它已发展成为一门成熟的编程语言,始终专注于文本处理。当万维网流行起来时,Perl 成为创建 CGI 脚本的事实标准。CGI 脚本是一个小软件,它根据数据库和/或访问网站的人员的输入生成动态网页。由于 CGI 脚本基本上是一个文本处理脚本,因此 Perl 是并且仍然是一个自然选择。

由于 Perl 专注于管理和处理文本,正则表达式文本模式是 Perl 语言的一个组成部分。这与大多数其他语言形成对比,在这些语言中,正则表达式可用作附加库。在 Perl 中,你可以使用 m// 运算符来测试正则表达式是否可以匹配字符串,例如:

if ($string =~ m/regex/) {
  print 'match';
} else {
  print 'no match';
}

执行正则表达式搜索和替换同样容易

$string =~ s/regex/replacement/g;

我在最后一个正斜杠后添加了一个“g”。“g”代表“全局”,它告诉 Perl 替换所有匹配项,而不仅仅是第一个匹配项。选项通常用斜杠表示,如“/g”,即使你没有添加额外的斜杠,即使你可以使用任何非单词字符代替斜杠。如果你的正则表达式包含斜杠,请使用另一个字符,如 s!regex!replacement!g

您可以添加一个“i”使正则表达式匹配不区分大小写。您可以添加一个“s”使匹配换行符。您可以添加一个“m”使美元符号和插入符号匹配字符串中嵌入的换行符,以及字符串的开头和结尾。

合在一起,您将得到类似于m/regex/sim;的内容

与正则表达式相关的特殊变量

Perl 有一系列特殊变量,它们会在每次m//s///正则表达式匹配后填充。$1$2$3等保存反向引用$+保存最后一个(编号最高)的反向引用。$&(美元符号和)保存整个正则表达式匹配。

@-是一个数组,其中包含字符串中的匹配开始索引。$-[0]保存整个正则表达式匹配的开始位置,$-[1]保存第一个反向引用的开始位置,依此类推。同样,@+保存匹配结束位置。要获取匹配的长度,请从$+[0]中减去$-[0]

在 Perl 5.10 及更高版本中,您可以使用关联数组%+获取由具名捕获组匹配的文本。例如,$+{name}保存由组“name”匹配的文本。Perl 不提供一种通过引用捕获组的名称来获取其匹配位置的方法。由于具名组也有编号,因此您可以对具名组使用@-@+,但您必须自己找出组的编号

$'(美元符号后跟撇号或单引号)保存正则表达式匹配之后(右侧)的字符串部分。$`(美元符号反引号)保存正则表达式匹配之前(左侧)的字符串部分。在性能至关重要的脚本中不建议使用这些变量,因为它会导致 Perl 减慢整个脚本中所有正则表达式匹配的速度。

所有这些变量都是只读的,并且会一直持续到尝试进行下一次正则表达式匹配。它们是动态作用域的,就好像它们在封闭作用域的开头有一个隐式的“local”一样。因此,如果您执行正则表达式匹配,并调用执行正则表达式匹配的子例程,当该子例程返回时,您的变量仍会像第一次匹配时一样设置。

在字符串中查找所有匹配项

“/g” 修饰符可用于处理字符串中的所有正则表达式匹配。第一个 m/regex/g 将找到第一个匹配,第二个 m/regex/g 将找到第二个匹配,依此类推。Perl 会自动记住字符串中下一次匹配尝试开始的位置,每个字符串都单独记住。以下是一个示例

while ($string =~ m/regex/g) {
  print "Found '$&'.  Next attempt at character " . pos($string)+1 . "\n";
}

pos() 函数检索下一次尝试开始的位置。字符串中的第一个字符的位置为零。您可以通过将该函数用作赋值的左侧来修改此位置,如 pos($string) = 123;

进一步阅读

Mastering Regular Expressions以上内容描述了如何将正则表达式与 Perl 一起使用,这可能就是您需要了解的所有内容。但是,如果您想深入了解 Perl 可以执行的所有与正则表达式相关的技巧,我建议您购买 Jeffrey Friedl 的 Mastering Regular Expressions 第二版。它有一个有趣的 80 页章节,介绍了与正则表达式相关的 Perl 怪癖。通用 Perl 书籍通常只包含本网站 教程 中解释得更好的通用内容。

我对 Mastering Regular Expressions 一书的评论

| 快速入门 | 教程 | 工具和语言 | 示例 | 参考 | 书籍评论 |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery 和 XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |