什么是'[my] system'提供的正则表达式库?

时间:2013-02-05 00:48:29

标签: regex linux gnu

GNU的 less 实用程序的 man 页面说明了以下关于搜索的内容:

/pattern
    Search forward in the file for the N-th line containing the pattern.  N
    defaults to 1.  The pattern is a regular expression, as recognized by the
    regular expression library supplied by your system.

我在所有类型的系统上使用 less :我的个人Ubuntu笔记本电脑,我的CentOS云服务器,Cygwin在工作中等等。我一直想做一些事情,比如负面预测和其他幻想东西,但我不知道使用什么正则表达式语法。我怎么知道?

3 个答案:

答案 0 :(得分:9)

这是一个编译时参数。较少的./configure脚本知道with-regex=LIB param。

这是来自上游包的自述文件的引用:

  

- 与正则表达式= LIB

     Specifies the regular expression library used by less for pattern
     matching.  The default is "auto", which means the configure program 
     finds a regular expression library automatically.  Other values are:
        posix          Use the POSIX-compatible regcomp.
        pcre           Use the PCRE library.
        regcmp         Use the regcmp library.
        re_comp        Use the re_comp library.
        regcomp        Use the V8-compatible regcomp.
        regcomp-local  Use Henry Spencer's V8-compatible regcomp
                       (source is supplied with less).

所以你需要知道'./configured'的减少程度。我在Debian / Ubuntu上调查了这个。他们使用POSIX正则表达式lib。

我仍然在寻找一种通过脚本动态检测它的方法......:)


更新:到目前为止我唯一能做的就是检测是否少用pcre正则表达式。如果使用--with-regex=pcre配置less,则它与libpcre.so共享库链接:

#!/bin/bash

# ldd prints out the shared libraries a binary is linked to.
# This can be used to check if less is linked against libpcre
if ldd "$(which less)" | grep 'libpcre\.so' ; then   
    echo "less uses pcre regex syntax"
else 
    echo "less uses non pcre regex syntax"
    # ... more checks should follow. currently trying to find a way
fi

答案 1 :(得分:5)

我不知道这是否适用于所有情况(旧版本/不同系统)但我能够使用less --version找到此信息:

less 458 (GNU regular expressions)
Copyright (C) 1984-2012 Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less

所以它的GNU正则表达式语法......

在使用--with-regex=pcre编译新版本后,我得到了

less 481 (PCRE regular expressions)
...

<强>更新

感谢crw进行检查。 此解决方案似乎确实是特定于版本的。在greenwoodsoftware(在Linux中)编译可用源代码后,我发现 不适用于版本436(2009年7月25日发布)及更早版本。它开始工作至少451(2012年9月4日发布)和更晚。 (这些版本之间的版本无法下载)。

答案 2 :(得分:0)

观察less --version输出的建议答案并没有解决我在Solaris 10上的情况 - 前两行是:

less 436
Copyright (C) 1984-2009 Mark Nudelman

我无法在动态依赖项列表中看到明显的正则表达式库:

$ ldd /usr/bin/less
        libcurses.so.1 =>        /lib/libcurses.so.1
        libc.so.1 =>     /lib/libc.so.1
        libm.so.2 =>     /lib/libm.so.2
        /lib/libm/libm_hwcap1.so.2
        /platform/sun4v/lib/libc_psr.so.1

man libc表示库提供了多个正则表达式接口:regcmpre_compregcomp

通过对二进制文件运行elfdump,我可以看到对符号regcomp的引用:

$ elfdump /usr/bin/less | egrep -i 'posix|pcre|regcmp|re_comp|regcomp|regcomp-local'
     [452]  0x0003d6a0 0x00000000  FUNC GLOB  D    0 UNDEF          regcomp
            [452]       regcomp
  R_SPARC_JMP_SLOT            0x3d6a0          0  .rela.plt      regcomp

如果这是regcomp正则表达式编译器函数的链接,则来自@ hek2mgl的答案中的README文本表明此less二进制文件可能使用POSIX正则表达式(或Spencer V8正则表达式,如果编译成二进制文件?)。

regcomp(3C)的手册页读取:

DESCRIPTION
     These functions interpret basic and extended regular expres-
     sions (described on the regex(5) manual page).

尝试less中的搜索,我发现正则表达式重复运算符{...}无反斜杠转义。我系统上regex(5)的联机帮助页将其定义为扩展正则表达式(ERE)语法。

最后,我发现了各种正则表达式引擎的several有趣的descriptions接口,总结如下:

Engine            Interface
----------------  --------------------------------
GNU               re_compile_pattern() and regex.h
PCRE              pcre_compile and pcre.h / pcre2_compile and pcre2.h
POSIX             regcomp() and regex.h
Henry Spencer V8  regcomp() and regexp.h
BSD               re_comp()
System V          regcmp()