Mam to wyrażenie regularne, które wyodrębnia guid i kilka innych atrybutów, takich jak nazwa, typ i wersja. Przejrzyj wyrażenie regularne w celu znalezienia wszelkich optymalizacji i ulepszeń.

Ciągi są zawsze we wzorcu

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

wyrażenie regularne

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

Rekordy testowe

Wyodrębnij pogrubione fragmenty z ciągu.

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

Oczekiwane wyniki:

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

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

Oczekiwany wynik

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

Kod

Język to F #, ale regex działa również w C #. Ponadto chciałbym użyć tego samego wyrażenia regularnego w Node.js, więc chciałbym, aby wyrażenie regularne było niezależne od języka.

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" 

tutaj wprowadź opis obrazu

Komentarze

  • dodany kod, język to c #, f #, ale powinien to być język agnostyka, używam też w nodejs, wyrażenie regularne musi być ogólne, nie jest wymagana żadna konkretna implementacja języka.
  • Nie ' t działa dla mnie na regexr
  • to działa. i.stack.imgur.com/gyZnT.png

Odpowiedź

TL; DR; lista dostosowań:

  • .NET RegEx obsługuje nazwane grupy przechwytywania. korzystaj z nich.
  • Skorzystaj ze specyfikacji formatu GUID.
  • Uprość pobieranie za pomocą grup nieprzechwytywanych.
  • Twórz założenia jawne w klasach znaków. Wolę zanegowane grupy znaków zamiast niechciwego dopasowania

Zamiast tego proponuję następujące wyrażenie regularne :

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

Chociaż to wyrażenie regularne jest nieco dłuższe, pasuje do obu przykładów w 62 krokach (w przeciwieństwie do 117). Może się to wydawać niewielkim ulepszeniem, ale to nie wszystko, co się dzieje:

To wyrażenie regularne używa nazwanych grup przechwytywania, które pozwalają na znacznie bardziej naturalne i wyraźne wyodrębnianie wzorców. Zamiast dostępu do grup za pomocą magicznych indeksów, możesz uzyskać do nich dostęp po nazwie, a konstrukcja matchEntity jest realizowana w następujący sposób:

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

Wreszcie to wyrażenie regularne również nie odpowiada nieprawidłowym specyfikacjom GUID

Komentarze

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *