Mám tento regulární výraz, který extrahuje guid a několik dalších atributů, jako je název, typ a verze. Zkontrolujte prosím regex, zda neobsahuje nějaké optimalizace a vylepšení.

Řetězce jsou vždy ve vzoru

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

regex

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

Testovací záznamy

Extrahujte z řetězce tučné části.

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

Očekávaný výstup:

  1. d40a4e4c-d6a3-45ae-98b3-924b31d8712a
  2. kolekce
  3. obsah1
  4. 1520623346833

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

Očekávaný výstup

  1. d40a4e4c-d6a3-45ae-98b3 -924b31d8712a
  2. článek
  3. testContent
  4. 1520623346891

kód

jazyk je F #, ale regex funguje také v C #. Dále bych chtěl použít stejný regex v Node.js, takže bych chtěl, aby byl regex jazykově agnostický.

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" 

zde zadejte popis obrázku

Komentáře

  • přidán kód, jazyk je c #, f #, ale měl by to být jazyková agnostika, používám také v nodejs, regex musí být obecný, není vyžadována žádná konkrétní implementace jazyka.
  • To není ' Pro mě nefunguje regexr
  • funguje to. i.stack.imgur.com/gyZnT.png

Odpovědět

TL; DR; seznam úprav:

  • Podpora .NET RegEx pojmenovaných skupin zachycení. využijte je.
  • Využijte specifikaci formátu GUID.
  • Zjednodušte načítání pomocí nezachycujících skupin.
  • Ve třídách znaků vytvořte předpoklady explicitní. Upřednostňujte negované chargroups před nenásytnými shody

Místo toho navrhuji následující regulární výraz :

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

I když je tento regulární výraz o něco delší, shoduje se s oběma příklady v 62 krocích (na rozdíl od 117). Může se to zdát jen jako drobné vylepšení, ale nestalo se vše:

Tento regulární výraz používá pojmenované skupiny zachycení, které umožňují mnohem přirozenější a jasnější extrakci vzoru. Místo přístupu ke skupinám pomocí magických indexů, můžete k nim přistupovat podle jména a konstrukce matchEntity se provádí následovně:

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 neposlední řadě tento regulární výraz také neodpovídá nesprávným specifikacím GUID

Komentáře

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *