我们在课堂上讲述了sed,我对sed使用正则expression式引擎的方式感到疑惑。 每个程序(sed,awk,grep等)是否使用了编程的正则expression式引擎,或者是否有一个正则expression式引擎工具/库/函数,开发人员sed,grep等只是在他们的代码中实现? 引擎内置于操作系统,然后由使用它的工具调用? 我想知道这将帮助我理解标准化正则expression式所达到的水平。 谁制造了你,正则引擎? 你的源代码在哪里?
默认情况下, sed
和grep
可以理解GNU Basic Regular Expressions符号,它是POSIX基本正则表达式标准的一个实现。 POSIX只是Unix系统应该订阅的标准,但它可以以任何方式实现。
此外, sed
与-r
和grep
与-e
或egrep
理解GNU扩展正则表达式符号与他们自己的实现。
有关基本和扩展的正则表达式的详细信息,请参阅http://www.regular-expressions.info/gnu.html 。
还有PCRE
和PCRE2
这是Perl兼容正则表达式。 这是一个用C / C ++实现的完整的库,可以作为其他C / C ++软件的标准实现。 PHP和pgrep
使用这个。 grep
也可以用-P
提供的grep
用PCRE编译支持。 (不是100%肯定,但我认为grep -P
在这种情况下只是在内部调用pgrep
)。
你可以阅读http://www.regular-expressions.info/pcre.html和http://www.regular-expressions.info/pcre2.html的细节
除此之外,许多语言和工具都有自己的正则表达式引擎。 Perl,Python,Java,JavaScript,SQL数据库都有自己的正则表达式实现或借用其他实现。 虽然他们共享相同的概念,但他们的符号和实现可能会有很大的不同。 http://www.regular-expressions.info/tools.html有许多实现正则表达式的软件列表。
要回答您提出的一些具体问题:
操作系统不在内核中实现任何正则表达式引擎。 正则表达式的实现与硬件无关,不需要任何形式的保护,资源管理或低级访问,这是操作系统内核最主要的处理方式。 所以不需要内核介入。
正则表达式引擎和源代码会因实现而有所不同。 如果可用,可以通过挖掘软件源代码的正则表达式特定模块来获取源代码。 但是,没有一个“统治所有人”的方式。
开始的一个好方法是熟悉一个正则表达式的实现。 由于它由sed
, grep
和awk
共享,GNU Extended是一个很好的开始。 Gnulib的源代码可以在http://www.gnu.org/software/gnulib找到 。 之后,您可以尝试学习其他实现的更高级功能。
希望这可以帮助!