Ik heb deze reguliere expressie die guid en een paar andere attributen zoals naam, type en versie extraheert. Bekijk de regex voor eventuele optimalisaties en verbeteringen.
Strings zijn altijd in het patroon van
/publication/guid/type/name;version=1234
regex
(([a-f0-9]+\-)+[a-f0-9]+)\/(.*?)\/(.*?);version=(\d*)
Testrecords
Extraheer vetgedrukte stukken uit een string.
/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/collection/content1;version=1520623346833
Verwachte output:
- d40a4e4c-d6a3-45ae-98b3-924b31d8712a
- verzameling
- content1
- 1520623346833
/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/article/testContent;version=1520623346891
Verwachte output
- d40a4e4c-d6a3-45ae-98b3 -924b31d8712a
- artikel
- testContent
- 1520623346891
Code
Taal is F #, maar de regex werkt ook in C #. Verder zou ik dezelfde regex willen gebruiken in Node.js, dus ik zou willen dat de regex taal-agnostisch is.
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"
Opmerkingen
- code toegevoegd, taal is c #, f # maar het zou taalonafhankelijk moeten zijn, ik gebruik het ook in nodejs, de regex moet generiek zijn, geen specifieke taalimplementatie vereist.
- Het hoeft niet ' werkt niet voor mij op regexr
- het werkt. i.stack.imgur.com/gyZnT.png
Antwoord
TL; DR; lijst met aanpassingen:
- .NET RegEx-ondersteuning met de naam capture-groepen. maak er gebruik van.
- Maak gebruik van de GUID-formaatspecificatie.
- Vereenvoudig het ophalen met niet-capturing groepen.
- Maak aannames expliciet in karakterklassen. Geef de voorkeur aan ontkende tekengroepen boven niet-hebzuchtige overeenkomsten.
Ik stel in plaats daarvan de voor volgens reguliere expressie :
(?<guid>[a-f0-9]{8}(?:\-[a-f0-9]{4}){3}\-[a-f0-9]{12})\/(?<type>[^\/]+)\/(?<name>[^;]+);version=(?<version>\d*)
Hoewel deze regex iets langer is, komt hij in 62 stappen overeen met beide voorbeelden (in tegenstelling tot 117). Dit lijkt misschien slechts een kleine verbetering, maar het is niet alles wat er gebeurt:
Deze regex gebruikt benoemde capturing-groepen die een veel natuurlijkere en duidelijkere patroondextractie mogelijk maken. In plaats van toegang te krijgen tot groepen via magische indices, je kunt ze op naam benaderen en de constructie van matchEntity
wordt als volgt bereikt:
let matchEntity (m: Match) = { id= m.Groups.["guid"].Value; eType = m.Groups.["type"].Value; name= m.Groups.["name"].Value; version = m.Groups.["version"].Value }
Last but not least deze regex komt ook niet overeen met onjuiste GUID-specificaties
Opmerkingen
- +1, onlangs is er ook ondersteuning voor genaamd RegExp capture-groepen in JS .