Perl 中称为“正则表达式”的字符串解析引擎与书籍中的术语“正则表达式”非常不同。
所以,我的问题是:是否有一些文档描述了 Perl 的正则表达式实现以及它与经典表达式的真正不同之处和方式(经典我的意思是可以真正转换为普通 DFA/NFA 的正则表达式)以及如何有用?
谢谢你。
Perl 中称为“正则表达式”的字符串解析引擎与书籍中的术语“正则表达式”非常不同。
所以,我的问题是:是否有一些文档描述了 Perl 的正则表达式实现以及它与经典表达式的真正不同之处和方式(经典我的意思是可以真正转换为普通 DFA/NFA 的正则表达式)以及如何有用?
谢谢你。
Perl 正则表达式当然被称为 Perl 正则表达式,或者简称为正则表达式。它们也可以称为模式或规则。但是它们是,或者至少可以是递归下降解析器。它们是使用递归回溯器实现的,但如果您更愿意将 DFA 可解决的任务卸载到DFA 引擎,您可以换入DFA 引擎。
以下是关于这些问题的一些相关引文,所有内容都令人鼓舞 - 以及一些文字:) - 我的:
您可以通过创建正则表达式(或regex)来指定模式,然后 Perl 的正则表达式引擎(本章其余部分的“引擎”)会采用该表达式并确定该模式是否(以及如何)匹配您的数据。虽然您的大部分数据可能是文本字符串,但没有什么能阻止您使用正则表达式来搜索和替换任何字节序列,即使是您通常认为的“二进制”数据。对 Perl 来说,字节只是顺序值小于 256 的字符。
如果您熟悉其他地方的正则表达式,我们应该警告您,正则表达式在 Perl 中有些不同。首先,从理论上讲,它们并不完全是“正则”,这意味着它们可以做的比计算机科学课程中教授的传统正则表达式要多得多。 其次,它们在 Perl 中经常使用,以至于它们有自己的特殊变量、运算符和引用约定,它们紧密集成到语言中,而不是像任何其他库一样松散地固定在上面。
—编程 Perl,作者:Larry Wall、Tom Christiansen 和 Jon Orwant
这是关于模式匹配的启示录,通常与 我们所说的“正则表达式”有关,它与真正的正则表达式只是边缘相关。尽管如此,这个术语随着我们模式匹配引擎的功能而增长,所以我不打算在这里与语言的必要性作斗争。然而,我通常称它们为“正则表达式”(或“正则表达式”,当我处于盎格鲁-撒克逊语境时)。
— Perl6 启示录 5:模式匹配,作者:Larry Wall
那里有很多新语法,所以让我们慢慢地逐步了解它,从以下开始:
$file = rx/ ^ <$hunk>* $ /;
此语句创建一个模式对象。或者,正如 Perl 6 中所说的,“规则”。人们可能仍然会称它们为“正则表达式”或“正则表达式”(关键字
rx
反映了这一点),但Perl 模式很久以前就不再是“正则”了,所以我们会尽量避免使用这些术语。[更新:我们复活了术语“正则表达式”来泛指这些模式。当我们现在说“规则”时,我们专门指的是您将在语法中使用的那种正则表达式。见 S05。]
— Perl6 注释 5:模式匹配,作者 Damian Conway
本文档总结了 Apocalypse 5,它是关于新的正则表达式语法的。 我们现在尝试将它们称为正则表达式而不是“正则表达式”,因为它们已经很久没有成为正则表达式了,我们认为流行的术语“正则表达式”正在成为一个具有精确含义的技术术语: “你做模式匹配的东西,有点像正则表达式”。另一方面,重新设计的目的之一是使我们的部分模式更易于在传统的正则表达式和解析器语义下进行分析,这涉及仔细区分我们的模式和语法的哪些部分将被视为声明性的,以及哪些部分是程序性的。
在任何情况下,当在语法中引用递归模式时,术语rule和token通常比regex更受欢迎。
— Perl6 概要 5:正则表达式和规则,作者 Damian Conway、Allison Randal、Patrick Michaud、Larry Wall 和 Moritz Lenz
O'Reilly的“Mastering Regular Expressions”一书对 Perl 和其他引擎有很好的解释。对我来说,这是有关该主题的参考书。
PCRE 接受的语言没有正式的数学名称。
术语“具有回溯的正则表达式”或“具有反向引用的正则表达式”与您将得到的差不多。任何熟悉差异的人都会知道您的意思。
(只有两种常见的正则表达式实现类型:基于 DFA 和基于回溯。前者普遍接受传统计算机科学意义上的“正则语言”。后者普遍接受...更多,这取决于具体实现,但反向引用始终是非 DFA 功能之一。)