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:

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

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

Verwachte output

  1. d40a4e4c-d6a3-45ae-98b3 -924b31d8712a
  2. artikel
  3. testContent
  4. 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" 

voer hier de beschrijving van de afbeelding in

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *