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ă:
- d40a4e4c-d6a3-45ae-98b3-924b31d8712a
- colecție
- conținut1
- 1520623346833
/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/article/testContent;version=1520623346891
Ieșire preconizată
- d40a4e4c-d6a3-45ae-98b3 -924b31d8712a
- articol
- testContent
- 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"
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
- +1, recent, există și suport pentru numite grupuri de capturi RegExp în JS .