Ho questa espressione regolare che estrae guid e un paio di altri attributi come nome, tipo e versione. Consulta la regex per eventuali ottimizzazioni e miglioramenti.

Le stringhe sono sempre nello schema di

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

regex

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

Test record

Estrai parti in grassetto dalla stringa.

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

Output previsto:

  1. d40a4e4c-d6a3-45ae-98b3-924b31d8712a
  2. raccolta
  3. contenuto1
  4. 1520623346833

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

Output previsto

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

Codice

La lingua è F #, ma la regex funziona anche in C #. Inoltre, vorrei utilizzare la stessa regex in Node.js, quindi vorrei che la regex fosse indipendente dalla lingua.

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" 

inserisci qui la descrizione dellimmagine

Commenti

  • codice aggiunto, la lingua è c #, f # ma dovrebbe essere indipendente dalla lingua, io uso anche in nodejs, la regex deve essere generica, non è richiesta alcuna implementazione del linguaggio specifico.
  • Non ' t funziona per me su regexr
  • funziona. i.stack.imgur.com/gyZnT.png

Risposta

TL; DR; elenco di modifiche:

  • .NET RegEx supporta gruppi di acquisizione denominati. utilizzali.
  • Utilizza la specifica del formato GUID.
  • Semplifica il recupero con i gruppi non di cattura.
  • Rendi espliciti i presupposti nelle classi di caratteri. Preferisco i gruppi di caratteri negati alla corrispondenza non avida

Propongo invece la seguente espressione regolare :

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

Sebbene questa regex sia leggermente più lunga, corrisponde a entrambi gli esempi in 62 passaggi (invece di 117). Questo può sembrare solo un piccolo miglioramento, ma non è tutto ciò che accade:

Questa regex utilizza gruppi di cattura denominati che consentono unestrazione di pattern molto più naturale e chiara. Invece di accedere ai gruppi tramite indici magici, puoi accedervi per nome e la costruzione di matchEntity viene eseguita come segue:

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

Ultimo ma non meno importante questa regex non corrisponde a specifiche GUID errate

Commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *