正则表达式引擎位于哪里?

3
我们在课堂上讲解sed,我想了解sed使用正则表达式引擎的方式。每个程序(sed、awk、grep等)是否都使用自己编程的正则表达式引擎,还是有一个正则表达式引擎工具/库/函数,由开发sed、grep等工具的人员在其代码中实现?这个引擎是内置于操作系统中,然后由使用它的工具调用吗?我感觉了解这些将有助于我理解正则表达式所达到的标准化水平。 你是谁制造的,正则表达式引擎?你的源代码在哪里?

3
有些程序使用通用库(如http://pcre.org),有些程序包含自己的正则表达式实现。还有一些程序使用模拟另一个正则表达式实现的正则表达式实现方式。这真是一团糟。 - nos
2
关于标准的好处是,人们说,有很多标准可以选择以适应您的需求...即使是众所周知的 grep 也能理解不止一种正则表达式语法。因此,您不能指望正则表达式在各处都被处理得完全相同(正则表达式在成为实现之前是想法),但了解典型的实现将帮助您快速掌握其他变体,就像知道如何在一种语言中编程会帮助您更快地学习下一种语言一样。 - Fred
请参阅 man regcompman regexec 以获取有关与您的操作系统一起提供的 C 库 regex 功能的文档。在 BSD 上,通常还有一个 man re_format,或者在 GNU 系统上,有一个 man 7 regex,以提供有关语法的文档,这些语法是您的操作系统设施支持的(而不是由第三方库或语言运行时安装的各种其他实现)。 - Charles Duffy
顺便提一下,一些第三方库提供的更高级的正则表达式版本在重要的客观指标上比传统实现更糟糕。请参见https://swtch.com/~rsc/regexp/regexp1.html。 - Charles Duffy
哈,是的@Fred。今天我实际上因为对微软一贯的(有时候,现在少了)自行其是的态度感到沮丧,所以我谷歌搜索了“为什么微软必须与众不同?” - Regular Jo
1个回答

2
默认情况下,sedgrep都能理解GNU基本正则表达式符号,这是POSIX基本正则表达式标准的一种实现。POSIX只是Unix系统应该遵循的标准,但它可以以任何方式实现。此外,sed使用-rgrep使用-eegrep可以理解GNU扩展正则表达式符号,并有自己的实现。请参见http://www.regular-expressions.info/gnu.html,了解基本和扩展的正则表达式详细信息。
还有PCREPCRE2,这是Perl兼容正则表达式。这是一个用C/C++实现的完整库,可以被其他C/C++软件用作标准实现。PHP和pgrep使用它。grep也可以使用-P,前提是grep已经编译了PCRE支持。(不确定,但我认为在这种情况下,grep -P只是在内部调用pgrep。)请参阅http://www.regular-expressions.info/pcre.htmlhttp://www.regular-expressions.info/pcre2.html,了解这些内容的详细信息。
除此之外,许多语言和工具都有自己的正则表达式引擎。Perl、Python、Java、JavaScript、SQL数据库都有自己的正则表达式实现或借鉴其他实现。虽然它们共享相同的概念,但它们的符号和实现可能会有很大的不同。请参阅http://www.regular-expressions.info/tools.html,了解实现正则表达式的许多软件列表。
回答一些你提出的具体问题:
操作系统没有在内核中实现任何正则表达式引擎。正则表达式实现与硬件无关,不需要任何种类的保护、资源管理或低级访问,这是操作系统内核主要处理的内容。因此,内核没有必要介入。
正则表达式引擎和源代码将因实现而异。如果可用,您可以通过挖掘软件源代码中的正则表达式特定模块来获取源代码。但并没有“一环统治所有”。
开始学习正则表达式的一个好方法是熟悉一种正则表达式实现。GNU扩展正则表达式是一个不错的选择,因为它被sedgrepawk所共享。该源代码可以在Gnulib上获得,网址是http://www.gnu.org/software/gnulib。在那之后,您可以尝试学习其他实现的更高级功能。
希望这能帮到你!

POSIX.2确实要求符合标准的操作系统提供正则表达式功能(如其标准C库中所示),因此我不确定操作系统不提供正则表达式引擎的说法是否完全准确。对于GNU的实现,我认为更经典的是https://www.gnu.org/software/libc/manual/html_node/Regular-Expressions.html--而不是gnulib(GPL软件,旨在为非GNU平台提供GNU扩展),而是glibc(LGPL,libc强制功能的超集)。 - Charles Duffy
我应该在答案中澄清,我的意思是操作系统内核的一部分。甚至grep和sed也是核心操作系统组件的一部分! - Munir
当他们说“操作系统”时,我没有理解为内核,但是那里确实存在歧义,澄清一下会很有帮助。 - Charles Duffy
1
Gnulib只是一个常见GNU代码的中央存储库。glibc和gnulib具有相同的regex实现,而regex模块是LGPL许可的(http://git.savannah.gnu.org/gitweb/?p=gnulib.git;a=blob_plain;f=modules/regex)。 Gnulib主要是为了允许在非GNU系统上开发使用GNU扩展的软件。 - Munir
感谢您对 gnulib 许可证的更正。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接