Ez a reguláris kifejezésem van, amely kivonja a guid-ot és néhány más attribútumot, például a nevet, a típust és a verziót. Kérjük, tekintse át a regexet az esetleges optimalizálások és fejlesztések tekintetében.

A karakterláncok mindig a következő mintájúak:

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

regex

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

Tesztrekordok

Kivonat vastag darabok a karaktersorozatból.

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

Várható kimenet:

  1. d40a4e4c-d6a3-45ae-98b3-924b31d8712a
  2. gyűjtemény
  3. tartalom1
  4. 1520623346833

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

Várható kimenet

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

kód

A nyelv F #, de a regex C # -ban is működik. Továbbá ugyanazt a regexet szeretném használni a Node.js fájlban, ezért azt szeretném, ha a regex nyelv agnosztikus lenne.

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" 

írja ide a kép leírását

Megjegyzések

  • kód hozzáadva, a nyelv c #, f #, de nyelvi agnosztikának kell lennie, a nodejs-ban is használom, a regexnek általánosnak kell lennie, nincs szükség külön nyelvű implementációra.
  • Nem ' nem működik a regexr-en
  • működik. i.stack.imgur.com/gyZnT.png

Válasz

TL; DR; a kiigazítások listája:

  • .NET RegEx támogatja a megnevezett elfogási csoportokat. használja ki őket.
  • Használja a GUID formátum specifikációt.
  • Egyszerűsítse a visszakeresést a nem rögzítő csoportokkal.
  • Tegye egyértelművé a feltételezéseket a karakterosztályokban. Inkább a negatív karaktercsoportokat részesítse előnyben a nem mohó egyezéssel szemben.

Javaslom a szabályos kifejezést követő helyett:

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

Bár ez a regex valamivel hosszabb, mindkét példával 62 lépésben egyezik (szemben a 117-tel). Ez csak egy apró javulásnak tűnhet, de nem minden történik:

Ez a regex megnevezett rögzítési csoportokat használ, amelyek sokkal természetesebb és egyértelműbb mintakivonatot tesznek lehetővé. Ahelyett, hogy varázsindexekkel érnék el a csoportokat, név szerint férhet hozzá hozzájuk, és a matchEntity felépítése a következőképpen valósul meg:

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

Végül, de nem utolsósorban ez a regex sem nem egyezik a helytelen GUID specifikációkkal

Megjegyzések

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük