определить, какие именованные захваты присутствуют в регулярном выражении? - PullRequest
3 голосов
/ 18 октября 2011

Имея регулярное выражение с именованными захватами, можно ли определить, какие именованные захваты присутствуют в re?

Примечание: у меня есть только регулярное выражение - у меня нет строки, которая соответствуетчисло рейнольдсаЯ хочу знать, есть ли способ просмотреть структуру re и найти все именованные захваты, используемые в re.

Ответы [ 2 ]

4 голосов
/ 18 октября 2011

В общем случае это невозможно, потому что у кого-то может быть вставка кода (??{....}), которая превращается во что-то, использующее именованный захват ранее невидимого имени во время выполнения матча.

В конкретном случае вы можете копаться в базовую структуру из C API.Devel::Peek предлагает несколько мест, где вы можете прогуляться:

% perl -MDevel::Peek -le 'Dump qr/(?<foo>\w+) (?&foo)/'
SV = IV(0x8033ac) at 0x8033b0
  REFCNT = 1
  FLAGS = (TEMP,ROK)
  RV = 0x803d40
  SV = REGEXP(0x8173d8) at 0x803d40
    REFCNT = 1
    FLAGS = (OBJECT,POK,FAKE,pPOK)
    PV = 0x216fc0 "(?^:(?<foo>\\w+) (?&foo))"
    CUR = 24
    LEN = 0
    STASH = 0x803b50    "Regexp"
    EXTFLAGS = 0x600000 (USE_INTUIT_NOML,USE_INTUIT_ML)
    INTFLAGS = 0x1
    NPARENS = 1
    LASTPAREN = 0
    LASTCLOSEPAREN = 0
    MINLEN = 3
    MINLENRET = 3
    GOFS = 0
    PRE_PREFIX = 4
    SEEN_EVALS = 0
    SUBLEN = 0
    SUBBEG = 0x0
    ENGINE = 0x162b60
    MOTHER_RE = 0x80fab0
    PAREN_NAMES = 0x80fa40
    SUBSTRS = 0x2044b0
    PPRIVATE = 0x206360
    OFFS = 0x204280

Например, PAREN_NAMES выглядит многообещающе.

Но это похоже на большую работу.Для чего вы хотите это сделать?

3 голосов
/ 18 октября 2011

Вы можете посмотреть на YAPE::Regex::Explain. Другие посты, кажется, предполагают, что http://rick.measham.id.au/paste/explain.pl является интерфейсом для него, но, конечно, его не сложно установить и использовать.

Я не уверен, насколько хорошо он делает именованные захваты, и, конечно, как уже сказал Трис, есть случаи, которые (вероятно) будут невозможны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...