【问题标题】:How to implement /e modifier with PCRE2?如何使用 PCRE2 实现 /e 修饰符?
【发布时间】:2017-02-08 04:17:04
【问题描述】:

在 Perl 中,我们可以做到这一点

s/pattern/func($1)/e

是否有任何方便的功能可以与 PCRE2 做同样的事情,比如

::pcre2_substitute_with_callback(
    re, // the compiled pattern
    pcuSubject, ccuSubject, // the subject and its length
    PCRE2_SUBSTITUTE_GLOBAL, // the substitute options
    matches,
    NULL, // the match context
    [](PCRE2_SPTR pcuMatched)->PCRE2_SPTR{ // the callback
        return "replacement";
    },
    pcuResult, &ccuResult
);

谢谢。

【问题讨论】:

    标签: c++ regex pcre


    【解决方案1】:

    不,我认为pcre2 没有这样的便利。请参阅下面的包装器。

    但是,我相信调用pcre2_substitute 的替换字符串可以在没有任何特别限制的情况下准备。 (我现在无法测试。)明确指定了使用转义字符($)来捕获组或模式项,但我不明白为什么不能在函数/回调中使用它来形成替换字符串。

    然后可以将其包装在具有所需签名的方法中。

    来自pcre2api 的更多文档位于Creating a new string with substitutions


    有一个 C++ 包装器 JPCRE2。为此,它使用RegexReplacereplace 方法。但是,大约在主页进行到一半时,它也告诉我们

    还有另一个替换函数 (jp::RegexReplace::nreplace()) 采用带有回调函数的 MatchEvaluator。当您必须根据某些条件动态创建替换字符串时,它是必需的。

    jp::MatchEvaluator 类实现了多个构造函数重载以采用不同的回调函数。

    该页面继续提供jp::RegexReplace::nreplace() 用法的完整示例。

    发行版的测试文件中提供了更详细的示例。

    【讨论】:

    • 我认为快速的答案是“不,PCRE2 中没有这样方便的功能”。我刚刚检查了 JPCRE2 是如何实现它的 jp::RegexReplace::nreplace() 的,它使用 pcre2_match(),这可能意味着“伙计们,你必须自己动手。没有方便的功能。”感谢您告诉我有关 JPCRE2 的信息。祝你有美好的一天。
    • @Cody 你说得对,我确实需要提前明确声明。谢谢。
    • @Cody : you have to do it yourselves in the hard way,我不确定我是否理解您要说的内容,但它是这样的:nreplace 方法采用一个函数,该函数返回一个字符串,其中 $ 是没什么特别的(字面意思)。尽管您可以轻松实现其行为,例如,您可以返回 "a"+m[0]+"b" 等等,而不是从回调中返回 "a$0b"。对于pcre2_substitute 的扩展功能,您可以使用if..else,这可能会更具可读性。
    猜你喜欢
    • 2014-02-16
    • 2013-03-05
    • 2014-12-09
    相关资源
    最近更新 更多