确定正则表达式中存在哪些命名捕获?

时间:2011-10-18 05:37:39

标签: regex perl

给定带有命名捕获的正则表达式,是否可以确定re中存在哪些命名捕获?

注意:我只有正则表达式 - 我没有匹配re的字符串。我想知道是否有办法查看re的结构并找到re中使用的所有命名捕获。

2 个答案:

答案 0 :(得分:4)

在一般情况下,这是不可能的,因为有人可能会有一个(??{....})代码插入变成在匹配执行期间使用迄今看不见的名称的命名捕获的东西。

在特定情况下,您可以从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看起来很有希望。

但这似乎很多工作。你想做什么?

答案 1 :(得分:3)

您可以查看YAPE::Regex::Explain。其他帖子似乎暗示http://rick.measham.id.au/paste/explain.pl是它的前端,但要确保它不难安装和使用。

我不确定它是如何命名捕获的,当然,正如tchrist所说,有些情况(可能)是不可能的。