Jai cette expression régulière qui extrait guid et quelques autres attributs comme le nom, le type et la version. Veuillez consulter lexpression régulière pour toute optimisation et amélioration.

Les chaînes sont toujours dans le modèle de

/publication/guid/type/name;version=1234 

regex

(([a-f0-9]+\-)+[a-f0-9]+)\/(.*?)\/(.*?);version=(\d*) 

Enregistrements de test

Extraire les éléments en gras de la chaîne.

/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/collection/content1;version=1520623346833

Résultat attendu:

  1. d40a4e4c-d6a3-45ae-98b3-924b31d8712a
  2. collection
  3. content1
  4. 1520623346833

/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/article/testContent;version=1520623346891

Résultat attendu

  1. d40a4e4c-d6a3-45ae-98b3 -924b31d8712a
  2. article
  3. testContent
  4. 1520623346891

Code

La langue est F #, mais le regex fonctionne aussi en C #. De plus, je voudrais utiliser la même expression régulière dans Node.js, donc je voudrais que lexpression régulière soit indépendante de la langue.

let matchEntity (m: Match) = { id= m.Groups.[1].Value; eType = m.Groups.[3].Value; name= m.Groups.[4].Value; version = m.Groups.[5].Value} let regex = new Regex("(([a-f0-9]+\-)+[a-f0-9]+)\/(.*?)\/(.*?);version=(\d*)") matchEntity regex.Match "/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/collection/content1;version=1520623346833" 

entrez la description de limage ici

Commentaires

  • code ajouté, le langage est c #, f # mais il devrait être indépendant du langage, jutilise aussi dans nodejs, le regex doit être générique, aucune implémentation de langage spécifique nest requise.
  • Cela ne ' t fonctionne pour moi sur regexr
  • ça marche. i.stack.imgur.com/gyZnT.png

Réponse

TL; DR; liste des ajustements:

  • .NET RegEx prend en charge les groupes de capture nommés. utilisez-les.
  • Utilisez la spécification de format GUID.
  • Simplifiez la récupération avec des groupes non capturants.
  • Rendez les hypothèses explicites dans les classes de caractères. Préférez les groupes de caractères refusés aux correspondances non gourmandes

Je propose plutôt l expression régulière suivante:

(?<guid>[a-f0-9]{8}(?:\-[a-f0-9]{4}){3}\-[a-f0-9]{12})\/(?<type>[^\/]+)\/(?<name>[^;]+);version=(?<version>\d*) 

Bien que cette expression régulière soit un peu plus longue, elle correspond aux deux exemples en 62 étapes (contre 117). Cela peut sembler une amélioration mineure, mais ce nest pas tout ce qui arrive:

Cette regex utilise des groupes de capture nommés qui permettent une extraction de modèle beaucoup plus naturelle et claire. Au lieu daccéder aux groupes par des indices magiques, vous pouvez y accéder par leur nom et la construction de matchEntity se fait comme suit:

let matchEntity (m: Match) = { id= m.Groups.["guid"].Value; eType = m.Groups.["type"].Value; name= m.Groups.["name"].Value; version = m.Groups.["version"].Value } 

Dernier point mais non le moindre cette expression régulière ne pas ne correspond à des spécifications GUID incorrectes

Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *