2017-02-08 3 views
3

En Perl, nous pouvons le faireComment implémenter/e modificateur avec PCRE2?

s/pattern/func($1)/e 

Y at-il fonction pratique qui fait la même chose avec PCRE2, comme

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

Merci.

Répondre

3

Non, je pense qu'il n'y a pas de telle commodité dans pcre2. Voir l'emballage ci-dessous cependant.

Cependant, je crois que la chaîne de remplacement pour l'appel à pcre2_substitute peut être préparée sans restrictions particulières. (Je ne peux pas tester maintenant.) L'utilisation du caractère d'échappement ($) pour capturer des groupes ou des éléments de pattern est clairement spécifiée mais je ne vois pas pourquoi on ne pourrait pas l'utiliser dans une fonction/callback pour former la chaîne de remplacement.

Cela peut ensuite être enveloppé dans une méthode avec une signature souhaitée.

plus de documentation de pcre2api est à Creating a new string with substitutions


Il y a un wrapper C++ JPCRE2. Il utilise la méthode replace de RegexReplace à cette fin. Cependant, à mi-chemin à travers la page principale, il nous informe également que

Il y a une autre fonction Replace (jp::RegexReplace::nreplace()) qui prend une MatchEvaluator avec une fonction de rappel. Il est requis lorsque vous devez créer les chaînes de remplacement de manière dynamique en fonction de certains critères.

La classe jp::MatchEvaluator implémente plusieurs surcharges de constructeur pour prendre différentes fonctions de rappel.

La page se poursuit avec un exemple complet pour l'utilisation de jp::RegexReplace::nreplace().

Des exemples plus détaillés sont proposés dans un fichier de test dans la distribution.

+0

Je pense que la réponse rapide est "Non, il n'y a pas de fonction aussi pratique dans PCRE2". Je viens de vérifier comment JPCRE2 implémente son jp :: RegexReplace :: nreplace(), et il utilise pcre2_match(), ce qui implique probablement "Les gars, vous devez le faire vous-même de la manière la plus difficile." Merci de m'avoir parlé de JPCRE2. Bonne journée. – Cody

+0

@Cody Vous avez raison, j'ai eu besoin de mettre une déclaration claire à l'avance. Je vous remercie. – zdim

+0

@Cody: "vous devez le faire vous-même de manière difficile", je ne suis pas sûr de comprendre ce que vous essayez de dire, mais c'est comme ça: la méthode 'nreplace' prend une fonction qui retourne une chaîne où' $ 'n'a rien de spécial (littéral). Bien que vous puissiez facilement implémenter son comportement, par exemple au lieu de renvoyer '" a $ 0b "' depuis le rappel, vous pouvez retourner '" a "+ m [0] +" b "' et ainsi de suite. Et pour la fonctionnalité étendue de 'pcre2_substitute', vous pouvez utiliser' if..else' qui sera probablement plus lisible. – Jahid