Minulla on tämä säännöllinen lauseke, joka poimii guidin ja pari muuta määritettä, kuten nimen, tyypin ja version. Tarkista mahdolliset optimoinnit ja parannukset regexistä.

Merkkijonot ovat aina mallin

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

regex

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

Testitietueet

Pura lihavoidut kappaleet merkkijonosta.

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

Odotettu tulos:

  1. d40a4e4c-d6a3-45ae-98b3-924b31d8712a
  2. kokoelma
  3. sisältö1
  4. 1520623346833

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

Odotettu lähtö

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

Koodi

Kieli on F #, mutta regex toimii myös C #: ssä. Lisäksi haluaisin käyttää samaa regexiä Node.js: ssä, joten haluaisin regexin olevan kieli-agnostinen.

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" 

kirjoita kuvan kuvaus tähän

kommentit

  • koodi lisätty, kieli on c #, f # mutta sen pitäisi olla kieliagnostiikkaa, käytän myös nodejsissa, regexin on oltava yleinen, ei tarvita erityistä kieltä.
  • Se ei ' ei toimi minulle regexrillä
  • se toimii. i.stack.imgur.com/gyZnT.png

vastaus

TL; DR; luettelo mukautuksista:

  • .NET RegEx tukee nimettyjä sieppausryhmiä. hyödynnä niitä.
  • Käytä GUID-muotomäärityksiä.
  • Yksinkertaista hakua ryhmillä, jotka eivät sieppaa.
  • Tee oletuksista selkeät merkkiluokissa. Mieluummin hylätyt ryhmäryhmät kuin ahne haku

Ehdotan sen sijaan seuraavaa säännöllistä lauseketta :

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

Vaikka tämä regex on jonkin verran pidempi, se vastaa molempia esimerkkejä 62 vaiheessa (toisin kuin 117). Tämä saattaa tuntua vain pieneltä parannukselta, mutta kaikki ei tapahdu:

Tämä regex käyttää nimettyjä sieppausryhmiä, jotka mahdollistavat paljon luonnollisemman ja selkeämmän kuvion poiminnan. Sen sijaan, että käytettäisiin ryhmiä taikuindekseillä pääset niihin nimellä ja matchEntity -sovelluksen toteutus tapahtuu seuraavasti:

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

Viimeisenä mutta ei vähäisimpänä tämä regex myös ei vastaa virheellisiä GUID-määrityksiä

kommentit

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *