Что такое библиотека регулярных выражений, предоставляемая [моей] системой? - программирование
Подтвердить что ты не робот

Что такое библиотека регулярных выражений, предоставляемая [моей] системой?

В справочной странице для утилиты, не содержащей GNU, говорится о следующем:

/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.

Я использую меньше на всех видах систем: мой личный ноутбук Ubuntu, мой облачный сервер CentOS, под Cygwin на работе и т.д. Я все время хочу делать что-то вроде негативного взгляда и других причудливых вещей, но я не знать, что использовать синтаксис regex. Как узнать?

4b9b3361

Ответ 1

Это параметр времени компиляции.. /configure script меньше знает параметр with-regex=LIB.

Это цитата из README пакета upstream:

- с-регулярное выражение = 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 V8-compatible regcomp
                       (source is supplied with less).

Итак, вам нужно знать, как меньше было "./configured". Я исследовал это на Debian/Ubuntu. Они используют POSIX regex lib.

Я все еще ищу способ обнаружить его динамически с помощью script...:)


Обновление. Единственное, что мне удалось до сих пор, это определить, меньше ли использует регулярные выражения pcre или нет. Если меньше было настроено с помощью --with-regex=pcre, оно связано с общей библиотекой 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

Ответ 2

Я не знаю, работает ли это во всех случаях (более старые версии/разные системы), но я смог найти эту информацию, используя 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

Итак, это синтаксис regex GNU...

И после компиляции более новой версии с --with-regex=pcre я получил

less 481 (PCRE regular expressions)
...

Обновление

Благодаря crw для проверки. Это решение похоже на версию. После компиляции доступного исходного кода в greenwoodsoftware (в Linux) я обнаружил, что он не работает для версий 436 (выпущен 25 июля 2009 г.) и раньше. Он начинает работать не менее 451 (выпущен 4 сентября 2012 года) и позже. (Версии между ними недоступны для загрузки).

Ответ 3

Рекомендуемый ответ на вывод 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 указывает, что библиотека предлагает несколько интерфейсов регулярного выражения: regcmp, re_comp и regcomp.

Запустив 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 regex, тогда текст README в ответе от @hek2mgl предполагает, что этот двоичный код 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).

Наконец, я нашел несколько интересных описаний интерфейсов различных двигателей регулярных выражений, приведенных ниже:

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()