Am această expresie regulată care extrage guid și câteva alte atribute precum numele, tipul și versiunea. Vă rugăm să examinați regexul pentru orice optimizare și îmbunătățire.

Șirurile sunt întotdeauna în modelul

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

regex

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

Înregistrări de testare

Extrageți piese aldine din șir.

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

Ieșire preconizată:

  1. d40a4e4c-d6a3-45ae-98b3-924b31d8712a
  2. colecție
  3. conținut1
  4. 1520623346833

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

Ieșire preconizată

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

Cod

Limba este F #, dar regexul funcționează și în C #. Mai mult, aș dori să folosesc aceeași regex în Node.js, așa că aș dori ca regex să fie un limbaj agnostic.

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" 

introduceți descrierea imaginii aici

Comentarii

  • cod adăugat, limba este c #, f # dar ar trebui să fie agnostice de limbă, eu folosesc și în nodejs, regex trebuie să fie generic, nu este necesară nicio implementare specifică a limbajului.
  • Nu ' nu funcționează pentru mine pe regexr
  • funcționează. i.stack.imgur.com/gyZnT.png

Răspuns

TL; DR; lista de ajustări:

  • .NET RegEx acceptă grupuri de capturi denumite. folosiți-le.
  • Faceți uz de specificația formatului GUID.
  • Simplificați recuperarea cu grupuri care nu captează.
  • Faceți presupuneri explicite în clasele de caractere. Preferă grupurile de caractere negate decât potrivirea fără lacomi

În schimb, propun următoarea expresie regulată :

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

În timp ce această regex este ceva mai lungă, se potrivește ambelor exemple în 62 de pași (spre deosebire de 117). Acest lucru poate părea doar o îmbunătățire minoră, dar nu este tot ceea ce se întâmplă:

Această regex folosește grupuri de captare numite care permit o extragere a modelelor mult mai naturală și mai clară. le puteți accesa după nume, iar construcția matchEntity se realizează după cum urmează:

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

Nu în ultimul rând această regex, de asemenea, nu se potrivește cu specificații GUID incorecte

Comentarii

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *