Regex 工具 |
grep |
语言和函数库 |
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 |
本网站更多信息 |
简介 |
正则表达式快速开始 |
正则表达式教程 |
取代字符串教学 |
应用程序和语言 |
正则表达式范例 |
正则表达式参考 |
替换字符串参考 |
Perl 对正则表达式的丰富支持
Perl 最初由 Larry Wall 设计为一种弹性的文本处理语言。多年来,它已发展成一种功能齐全的编程语言,并持续专注于文本处理。当万维网普及时,Perl 成为创建 CGI 脚本的事实标准。CGI 脚本是一小段软件,可根据数据库和/或造访网站的人员输入,产生动态网页。由于 CGI 脚本基本上是一种文本处理脚本,因此 Perl 是而且仍然是自然选择。
由于 Perl 专注于管理和处理文本,正则表达式文本样式 是 Perl 语言中不可或缺的一部分。这与大多数其他语言形成对比,在这些语言中,正则表达式可用作附加函数库。在 Perl 中,您可以使用 m//
操作符来测试 regex 是否可以比对字符串,例如:
if ($string =~ m/regex/) { print 'match'; } else { print 'no match'; }
运行 regex 搜索和取代也一样容易
$string =~ s/regex/replacement/g;
我在最后一个正斜线后加上一个「g」。「g」代表「全域」,告诉 Perl 取代所有符合的项目,而不仅仅是第一个。选项通常会包含正斜线,例如「/g」,即使你没有添加额外的正斜线,而且你也可以使用任何非字符来取代正斜线。如果你的 regex 包含正斜线,请使用其他字符,例如 s!regex!replacement!g
。
你可以添加一个「i」让 regex 比对不区分大小写。你可以添加一个「s」让 点 符合换行符号。你可以添加一个「m」让 美元符号和插入符号 符合字符串中内嵌的换行符号,以及字符串的开头和结尾。
将这些条件组合起来,你会得到类似 m/regex/sim;
的结果
与 Regex 相关的特殊变量
Perl 有一组特殊变量,会在每次 m//
或 s///
regex 比对后填入数据。 $1
、$2
、$3
等会保存 反向引用。 $+
会保存最后一个(编号最高的)反向引用。 $&
(美元符号加上&符号)会保存整个 regex 比对结果。
@-
是字符串中比对开始索引的数组。 $-[0]
保存整个 regex 比对的开头,$-[1]
保存第一个反向引用的开头,依此类推。同样地,@+
会保存比对结束位置。若要取得比对长度,请从 $+[0]
减去 $-[0]
。
在 Perl 5.10 及更新版本中,你可以使用关联式数组 %+
来取得 命名捕获组 比对的文本。例如,$+{name}
会保存群组「name」比对的文本。Perl 没有提供通过参照群组名称取得捕获组比对位置的方法。由于命名组也有编号,你可以对命名组使用 @-
和 @+
,但你必须自行 找出群组的编号。
$'
(美元符号加上撇号或单引号)会保存 regex 比对后(右侧)的字符串部分。 $`
(美元符号加上反引号)会保存 regex 比对前(左侧)的字符串部分。不建议在性能很重要的脚本中使用这些变量,因为它会让 Perl 放慢整个脚本中所有 regex 比对的速度。
所有这些变量都是唯读的,并会持续到下一次 regex 比对尝试为止。它们是动态范围的,就好像在封闭范围的开头有一个隐含的「local」一样。因此,如果你运行 regex 比对,然后调用运行 regex 比对的子程序,当该子程序传回时,你的变量仍会设置为第一次比对的状态。
在字符串中寻找所有符合的项目
「/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;
。