Jeg har dette regulære udtryk, der udtrækker guid og et par andre attributter som navn, type og version. Gennemse regex for eventuelle optimeringer og forbedringer.

Strenge er altid i mønsteret af

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

regex

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

Testregistreringer

Uddrag fed skrift fra streng.

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

Forventet output:

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

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

Forventet output

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

Kode

Sprog er F #, men regex fungerer også i C #. Desuden vil jeg gerne bruge den samme regex i Node.js, så jeg vil gerne have, at regexen er sprog agnostisk.

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" 

indtast billedbeskrivelse her

Kommentarer

  • kode tilføjet, sprog er c #, f # men det burde være sprogagnostik, jeg bruger også i nodejs, regex skal være generisk, ingen specifik sprogimplementering kræves.
  • Det gør ikke ' t arbejde for mig på regexr
  • det virker. i.stack.imgur.com/gyZnT.png

Svar

TL; DR; liste over justeringer:

  • . NET RegEx understøtter navngivne capture-grupper. gør brug af dem.
  • Brug GUID-formatspecifikationen.
  • Forenkling af hentning med ikke-fangende grupper.
  • Gør antagelser eksplicit i tegnklasser. Foretrækker negerede chargroups frem for ikke-grådige matching

Jeg foreslår i stedet for regulært udtryk i stedet:

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

Selvom denne regex er noget længere, svarer den til begge eksempler i 62 trin (i modsætning til 117). Dette kan kun virke som en mindre forbedring, men det er ikke alt, hvad der sker:

Denne regex bruger navngivne fangergrupper, der tillader en meget mere naturlig og klar mønsterudvinding. I stedet for at få adgang til grupper ved magiske indeks, du kan få adgang til dem ved navn, og konstruktionen af matchEntity opnås som følger:

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

Sidst men ikke mindst denne regex matcher ikke matcher forkerte GUID-specifikationer

Kommentarer

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *