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:
- d40a4e4c-d6a3-45ae-98b3-924b31d8712a
- collection
- content1
- 1520623346833
/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/article/testContent;version=1520623346891
Résultat attendu
- d40a4e4c-d6a3-45ae-98b3 -924b31d8712a
- article
- testContent
- 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"
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
- +1, récemment, il existe également une prise en charge des groupes de capture RegExp nommés dans JS .