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:
- d40a4e4c-d6a3-45ae-98b3-924b31d8712a
- gyűjtemény
- tartalom1
- 1520623346833
/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/article/testContent;version=1520623346891
Várható kimenet
- d40a4e4c-d6a3-45ae-98b3 -924b31d8712a
- cikk
- testContent
- 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"
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
- +1, a közelmúltban támogatják a RegExp elnevezésű rögzítési csoportokat a JS-ben .