给定带有命名捕获的正则表达式,是否可以确定re中存在哪些命名捕获?
注意:我只有正则表达式 - 我没有匹配re的字符串。我想知道是否有办法查看re的结构并找到re中使用的所有命名捕获。
答案 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所说,有些情况(可能)是不可能的。