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

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

最佳答案

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

在特定情况下,您可能能够从 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 看起来很有前途。

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

关于regex - 确定正则表达式中存在哪些命名捕获?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7802855/

10-11 07:15