Ich habe diesen regulären Ausdruck, der Guid und einige andere Attribute wie Name, Typ und Version extrahiert. Bitte überprüfen Sie den regulären Ausdruck auf Optimierungen und Verbesserungen.

Zeichenfolgen haben immer das Muster

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

regulärer Ausdruck

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

Testaufzeichnungen

Extrahieren Sie fette Teile aus der Zeichenfolge.

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

Erwartete Ausgabe:

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

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

Erwartete Ausgabe

  1. d40a4e4c-d6a3-45ae-98b3 -924b31d8712a
  2. Artikel
  3. Testinhalt
  4. 1520623346891

Code

Sprache ist F #, aber Die Regex funktioniert auch in C #. Darüber hinaus möchte ich denselben regulären Ausdruck in Node.js verwenden, daher möchte ich, dass der reguläre Ausdruck sprachunabhängig ist.

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" 

Geben Sie hier die Bildbeschreibung ein.

Kommentare

  • Code hinzugefügt, Sprache ist c #, f #, aber es sollte sprachunabhängig sein, ich verwende auch in nodejs, der reguläre Ausdruck muss generisch sein, keine spezifische Sprachimplementierung erforderlich.
  • Es ist nicht ' funktioniert bei regexr nicht
  • es funktioniert. i.stack.imgur.com/gyZnT.png

Antwort

TL; DR; Liste der Anpassungen:

  • .NET RegEx unterstützt benannte Erfassungsgruppen. Verwenden Sie sie.
  • Verwenden Sie die GUID-Formatspezifikation.
  • Vereinfachen Sie das Abrufen mit nicht erfassenden Gruppen.
  • Machen Sie Annahmen in Zeichenklassen explizit. Bevorzugen Sie negierte Zeichengruppen gegenüber nicht gierigen Übereinstimmungen.

Ich schlage stattdessen den folgenden regulären Ausdruck vor:

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

Obwohl dieser reguläre Ausdruck etwas länger ist, entspricht er beiden Beispielen in 62 Schritten (im Gegensatz zu 117). Dies scheint nur eine geringfügige Verbesserung zu sein, aber es ist nicht alles, was passiert:

Diese Regex verwendet benannte Erfassungsgruppen, die eine viel natürlichere und klarere Musterextraktion ermöglichen. Anstatt auf Gruppen über magische Indizes zuzugreifen, Sie können über den Namen darauf zugreifen, und die Konstruktion von matchEntity erfolgt wie folgt:

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 Dieser reguläre Ausdruck stimmt auch nicht mit falschen GUID-Spezifikationen überein.

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.