Jeg har dette vanlige uttrykket som trekker ut guid og et par andre attributter som navn, type og versjon. Gjennomgå regexen for eventuelle optimaliseringer og forbedringer.

Strenger er alltid i mønsteret av

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

regex

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

Testposter

Trekk ut fete brikker fra streng.

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

Forventet utgang:

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

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

Forventet utgang

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

Kode

Språk er F #, men regex fungerer også i C #. Videre vil jeg bruke samme regex i Node.js, så jeg vil at regex skal være språkagnostisk.

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" 

skriv inn bildebeskrivelse her

Kommentarer

  • kode lagt til, språk er c #, f # men det skal være språkagnostikk, jeg bruker også i nodejs, regex må være generisk, ingen spesifikk språkimplementering er nødvendig.
  • Det gjør ikke ' ikke jobbe for meg med regexr
  • det fungerer. i.stack.imgur.com/gyZnT.png

Svar

TL; DR; liste over justeringer:

  • .NET RegEx støtter navngitte fangstgrupper. bruk dem.
  • Benytt deg av GUID-formatsspesifikasjonen.
  • Forenkle henting med grupper som ikke er fanget.
  • Gjør antagelser eksplisitte i tegnklasser. Foretrekker negerte chargroups fremfor ikke-grådige matching

Jeg foreslår at følger vanlig uttrykk i stedet:

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

Selv om denne regexen er noe lengre, samsvarer den med begge eksemplene i 62 trinn (i motsetning til 117). Dette kan bare virke som en mindre forbedring, men det er ikke alt som skjer:

Denne regexen bruker navngitte fangegrupper som tillater en mye mer naturlig og klar mønsterutvinning. I stedet for å få tilgang til grupper ved magiske indekser, du kan få tilgang til dem ved navn og konstruksjonen av matchEntity oppnå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 } 

Sist men ikke minst denne regexen samsvarer også ikke feil GUID-spesifikasjoner

Kommentarer

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *