Jag har det här reguljära uttrycket som extraherar guid och några andra attribut som namn, typ och version. Granska regex för eventuella optimeringar och förbättringar.

Strängar finns alltid i mönstret av

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

regex

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

Testposter

Extrahera djärva bitar från sträng.

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

Förväntad utgång:

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

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

Förväntad utgång

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

Kod

Språket är F #, men regex fungerar också i C #. Dessutom skulle jag vilja använda samma regex i Node.js, så jag skulle vilja att regexen skulle vara 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" 

ange bildbeskrivning här

Kommentarer

  • kod har lagts till, språket är c #, f # men det borde vara språkagnostiker, jag använder också i nodejs, regex måste vara generiskt, ingen specifik språkimplementering krävs.
  • Det gör inte ' t arbeta för mig på regexr
  • det fungerar. i.stack.imgur.com/gyZnT.png

Svar

TL; DR; lista med justeringar:

  • . NET RegEx stöder namngivna grupper. använd dem.
  • Använd GUID-formatspecifikationen.
  • Förenkla hämtningen med icke-fångande grupper.
  • Gör antaganden tydliga i teckenklasser. Föredrar negerade chargroups framför icke-girig matchning

Jag föreslår istället för följande reguljära uttryck :

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

Även om denna regex är något längre matchar den båda exemplen i 62 steg (i motsats till 117). Detta kan bara verka som en mindre förbättring, men det är inte allt som händer:

Denna regex använder namngivna grupper som tillåter en mycket mer naturlig och tydlig mönsteruttagning. I stället för att komma åt grupper med magiska index, du kan komma åt dem med namn och konstruktionen av matchEntity utförs enligt följande:

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 inte minst den här regexen matchar inte heller inte felaktiga GUID-specifikationer

Kommentarer

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *