2017-02-08 3 views
3

In Perl, können wir dieseWie implementiert man/e Modifikator mit PCRE2?

s/pattern/func($1)/e 

tun Gibt es eine praktische Funktion, die gleiche Sache mit PCRE2 tut, wie

::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 
); 

Dank.

Antwort

3

Nein, ich denke, dass es keinen solchen Komfort in pcre2 gibt. Sehen Sie sich den Wrapper unten an.

Allerdings glaube ich, dass die Ersatzzeichenfolge für den Anruf pcre2_substitute ohne besondere Einschränkungen vorbereitet werden kann. (Ich kann jetzt nicht testen.) Die Verwendung des Escape-Zeichens ($) zum Erfassen von Gruppen oder Musterelementen ist klar angegeben, aber ich sehe nicht, warum man das nicht in einer Funktion/Callback verwenden könnte, um die Ersetzungszeichenfolge zu bilden.

Das kann dann in einer Methode mit einer gewünschten Signatur verpackt werden.

Einige weitere Dokumentation von pcre2api ist bei Creating a new string with substitutions


Es ist eine C++ Wrapper JPCRE2. Es verwendet die replace Methode von RegexReplace für diesen Zweck. Doch etwa auf halbem Weg durch die Hauptseite informiert er uns auch, dass

Es gibt eine andere ist Ersetzen-Funktion (jp::RegexReplace::nreplace()), die eine MatchEvaluator mit einer Callback-Funktion übernimmt. Es ist erforderlich, wenn Sie die Ersetzungszeichenfolgen dynamisch nach bestimmten Kriterien erstellen müssen.

Die Klasse jp::MatchEvaluator implementiert mehrere Konstruktorüberladungen, um verschiedene Rückruffunktionen zu übernehmen.

Die Seite wird mit einem vollständigen Beispiel für die Verwendung von jp::RegexReplace::nreplace() fortgesetzt.

Detailliertere Beispiele werden in einer Testdatei in der Distribution angeboten.

+0

Ich denke, die schnelle Antwort ist "Nein, es gibt keine solche bequeme Funktion in PCRE2". Ich habe gerade überprüft, wie JPCRE2 jp :: RegexReplace :: nreplace() implementiert, und es verwendet pcre2_match(), was wahrscheinlich bedeutet "Jungs, Sie müssen es selbst auf die harte Art tun. Keine bequeme Funktion." Danke, dass du mir von JPCRE2 erzählt hast. Einen schönen Tag noch. – Cody

+0

@Cody Sie haben Recht, ich musste im Voraus eine klare Aussage machen. Vielen Dank. – zdim

+0

@Cody: 'Du musst es selbst auf die harte Tour machen', ich bin mir nicht sicher, ob ich verstehe, was du sagen willst, aber es ist so: Die 'nreplace'-Methode nimmt eine Funktion, die eine Zeichenkette mit $ zurückgibt 'ist nichts besonderes (wörtlich). Obwohl Sie sein Verhalten einfach implementieren können, z. B. anstatt "$ 0b" aus dem Callback zurückzugeben, können Sie '" a "+ m [0] +" b "' usw. zurückgeben. Und für die erweiterte Funktionalität von 'pcre2_substitute' können Sie' if..else' verwenden, das wahrscheinlich besser lesbar ist. – Jahid

Verwandte Themen