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:
- d40a4e4c-d6a3-45ae-98b3-924b31d8712a
- Sammlung
- content1
- 1520623346833
/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/article/testContent;version=1520623346891
Erwartete Ausgabe
- d40a4e4c-d6a3-45ae-98b3 -924b31d8712a
- Artikel
- Testinhalt
- 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"
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
- +1, kürzlich wird auch benannte RegExp-Erfassungsgruppen in JS unterstützt.