J'ai essayé d'améliorer la réponse de korun en encapsulant tout et en implémentant la prise en charge de la division des groupes de capture et des jeux de caractères - ce qui rend cette méthode beaucoup plus polyvalente.
Pour utiliser cet extrait, vous devez appeler la fonction variadique combineRegex
dont les arguments sont les objets d'expression régulière que vous devez combiner. Son implémentation se trouve en bas de page.
Les groupes de capture ne peuvent cependant pas être divisés directement de cette manière, car certaines parties ne comporteraient qu'une seule parenthèse. Votre navigateur échouerait avec une exception.
Au lieu de cela, je passe simplement le contenu du groupe de capture dans un tableau. Les parenthèses sont automatiquement ajoutées lorsque combineRegex
rencontre un tableau.
De plus, les quantificateurs doivent suivre quelque chose. Si, pour une raison quelconque, l'expression régulière doit être divisée devant un quantificateur, vous devez ajouter une paire de parenthèses. Celles-ci seront supprimées automatiquement. Le fait est qu'un groupe de capture vide est plutôt inutile et que, de cette façon, les quantificateurs ont quelque chose à quoi se référer. La même méthode peut être utilisée pour des choses comme les groupes de non-capture ( /(?:abc)/
devient [/()?:abc/]
).
La meilleure façon de l'expliquer est d'utiliser un exemple simple :
var regex = /abcd(efghi)+jkl/;
deviendrait :
var regex = combineRegex(
/ab/,
/cd/,
[
/ef/,
/ghi/
],
/()+jkl/ // Note the added '()' in front of '+'
);
Si vous devez diviser les jeux de caractères, vous pouvez utiliser des objets ( {"":[regex1, regex2, ...]}
) au lieu de tableaux ( [regex1, regex2, ...]
). Le contenu de la clé peut être n'importe quoi, tant que l'objet ne contient qu'une seule clé. Notez qu'au lieu de ()
vous devez utiliser ]
comme début fictif si le premier caractère peut être interprété comme un quantificateur. C'est-à-dire /[+?]/
devient {"":[/]+?/]}
Voici l'extrait et un exemple plus complet :
function combineRegexStr(dummy, ...regex)
{
return regex.map(r => {
if(Array.isArray(r))
return "("+combineRegexStr(dummy, ...r).replace(dummy, "")+")";
else if(Object.getPrototypeOf(r) === Object.getPrototypeOf({}))
return "["+combineRegexStr(/^\]/, ...(Object.entries(r)[0][1]))+"]";
else
return r.source.replace(dummy, "");
}).join("");
}
function combineRegex(...regex)
{
return new RegExp(combineRegexStr(/^\(\)/, ...regex));
}
//Usage:
//Original:
console.log(/abcd(?:ef[+A-Z0-9]gh)+$/.source);
//Same as:
console.log(
combineRegex(
/ab/,
/cd/,
[
/()?:ef/,
{"": [/]+A-Z/, /0-9/]},
/gh/
],
/()+$/
).source
);