Nommé capturer les groupes regex en JavaScript?
Autant que je sache, il n'y a pas une telle chose comme l'appelle de capturer les groupes en JavaScript. Quelle est l'alternative pour obtenir des fonctionnalités similaires?
- Groupes de Capture sont en javascript par numéro ..$1 est le premier groupe capturé, $2, $3 ... jusqu'à 99$, mais il semble que vous voulez quelque chose d'autre, qui n'existe pas
- vous parlez numérotées de capturer les groupes, l'OP parle nommée capturer les groupes. Ils existent, mais nous voulons savoir si il y a de l'aide pour eux en JS.
- Il y a un proposition de porter nommé regex en JavaScript, mais c'est peut-être des années avant de voir que, si jamais nous ne.
Vous devez vous connecter pour publier un commentaire.
ECMAScript 2018 introduit nommé capturer les groupes en JavaScript regexes.
Si vous avez besoin de soutenir les anciens navigateurs, vous pouvez tout faire avec la normale (numérotés) de capturer les groupes que vous pouvez faire avec nommée capturer les groupes, vous avez juste besoin de garder une trace des numéros qui peuvent être lourdes si l'ordre de la capture d'un groupe dans votre regex changements.
Il y a seulement deux "structurelle" avantages de l'nommé capturer les groupes que je pense:
Dans certains regex saveurs.NET et JGSoft, autant que je sache), vous pouvez utiliser le même nom pour les différents groupes de votre regex (voir ici pour un exemple où cette matière). Mais la plupart des regex saveurs ne prennent pas en charge cette fonctionnalité de toute façon.
Si vous avez besoin de se référer à numérotées de capturer les groupes dans une situation où ils sont entourés par des chiffres, vous pouvez obtenir un problème. Disons que vous voulez ajouter un zéro à un chiffre et donc vouloir remplacer
(\d)
avec$10
. En JavaScript, cela fonctionne (tant que vous avez moins de 10 capture d'un groupe dans votre regex), mais Perl vont penser que vous êtes à la recherche pour la référence arrière nombre10
la place de numéro1
, suivie par une0
. En Perl, vous pouvez utiliser${1}0
dans ce cas.Autres que les que les, nommée capturer les groupes sont juste "sucre syntaxique". Il permet d'utiliser la capture de groupes uniquement lorsque vous en avez vraiment besoin et l'utilisation de non-capture de groupes
(?:...)
dans tous les autres cas.Le plus gros problème (à mon avis) avec JavaScript, c'est qu'il ne prend pas en charge verbose regexes qui ferait de la création d'lisible, complexe expressions régulières beaucoup plus facile.
Steve Levithan de XRegExp bibliothèque résout ces problèmes.
Vous pouvez utiliser XRegExp, augmentée, extensible, multi-navigateur et la mise en œuvre d'expressions régulières, y compris le soutien pour la syntaxe supplémentaire, les indicateurs et méthodes:
s
, de faire dot correspondre à tous les personnages (aka dotall ou singleline mode), etx
, gratuit pour les-de l'espacement et de commentaires (aka le mode étendu).Une autre solution possible: créer un objet contenant les noms de groupe et les index.
Ensuite, utilisez les clés de l'objet de référence les groupes:
Cela améliore la lisibilité/de la qualité du code en utilisant les résultats de la regex, mais pas à la lisibilité de la regex lui-même.
Dans l'ES6, vous pouvez utiliser la matrice de déstructuration de l'attraper vos groupes:
Avis:
let
saute la première valeur du tableau qui en résulte, qui est l'ensemble de la chaîne correspond|| []
après.match()
permettra d'éviter une déstructuration de l'erreur quand il n'y a pas de matchs (car.match()
sera de retournull
)String.prototype.match
retourne un tableau avec: l'ensemble de la chaîne correspond à la position 0, puis tous les groupes après que. La première virgule dit "ignorer l'élément à la position 0"RegExp.prototype.exec
surString.prototype.match
dans des endroits où la chaîne peut êtrenull
ouundefined
.Mise à jour: Il finalement fait en JavaScript (ECMAScript 2018)!
Nommé capturer les groupes pourraient le faire en JavaScript très bientôt.
La proposition est à l'étape 3 déjà.
Un groupe de capture peut être donné un nom à l'intérieur de crochets angulaires à l'aide de la
(?<name>...)
syntaxe, pourtout nom de l'identificateur. L'expression régulière pour un jour peut être
écrit comme
/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u
. Chaque nomdoit être unique et suivez la grammaire pour ECMAScript identifiant-nom.
Groupes cités peuvent être accessibles à partir des propriétés de l'un des groupes de propriété de
le résultat de l'expression régulière. Des références numérotées pour les groupes
également créé, tout comme pour les non-nommé groupes. Par exemple:
De nommage capturé groupes fournissent une chose: moins de confusion complexe, avec des expressions régulières.
Cela dépend vraiment de votre cas d'utilisation, mais peut-être l'impression de votre regex pourrait aider.
Ou vous pourrait essayer de définir des constantes de vous référer à votre capturé groupes.
Commentaires pourraient alors également aider à montrer à d'autres personnes qui lisent votre code, ce que vous avez fait.
Pour le reste je suis d'accord avec Tims réponse.
Il y a un node.js bibliothèque appelée nommé regexp que vous pouvez utiliser dans votre node.js projets (dans le navigateur par l'emballage de la bibliothèque avec browserify, ou tout autre emballage de scripts). Cependant, la bibliothèque ne peut pas être utilisé avec des expressions régulières qui contiennent des non-nommé de capturer les groupes.
Si vous comptez l'ouverture de la capture des accolades dans votre expression régulière, vous pouvez créer un mappage entre nommé capturer les groupes et le numéro de capturer les groupes dans votre regex et peuvent mélanger et assortir librement. Vous avez juste à supprimer les noms de groupe avant d'utiliser les regex. J'ai écrit trois fonctions qui montrent que. Voir ce gist: https://gist.github.com/gbirke/2cc2370135b665eee3ef
Si vous ne pouvez pas faire cela avec de la vanille JavaScript, peut-être que vous pouvez utiliser certains
Array.prototype
fonction commeArray.prototype.reduce
à son tour indexé correspond à celles qui sont spécifiées à l'aide de certains magie.Évidemment, la solution suivante aura besoin que les matchs se produisent dans l'ordre:
JS:
var assocArray = Regex("hello alex, I am dennis", "hello ({hisName}.+), I am ({yourName}.+)");
RegExp
objet par l'ajout d'une fonction à son prototype.