Gibt es eine gegebene Zeichenfolge, die durch :
getrennt ist, ist es möglich, einen regulären Ausdruck zu konstruieren, um die eindeutigen Bezeichner in eine andere Zeichenfolge zu extrahieren, auch getrennt durch :
?
Wie ist es möglich, dies mit einem regulären Ausdruck zu erreichen? Ich habe s/(:[^:])(.*)//g
ohne Glück versucht, weil die (.*)
gierig ist und zur letzten Übereinstimmung von springt.
Beispiel: a:b:c:d:c:c:x:c:c:e:e:f
sollte a:b:c:d:x:e:f
Hinweis: Ich bin in Perl programmiert, aber ich würde sehr gerne eine Regex dafür verwenden.
In .NET, das unendliche Wiederholungen innerhalb von Lookbehind unterstützt, können Sie nach
suchen %Vor%und ersetzen Sie alle Übereinstimmungen durch die leere Zeichenfolge.
Perl (mindestens Perl 5) unterstützt nur Look-Behinds fester Länge. Sie können also Folgendes versuchen (mit Lookahead, mit einem etwas anderen Ergebnis):
%Vor%Wenn Sie das durch die leere Zeichenfolge ersetzen, werden alle vorherigen Wiederholungen eines doppelten Eintrags entfernt. der letzte wird beibehalten. Also statt
%Vor%würdest du
bekommen %Vor%Wenn das in Ordnung ist, können Sie
verwenden %Vor%Erläuterung:
Erste Regex:
(?<=\b:.*)
: Überprüfen Sie, ob Sie den Inhalt der Backreference-Nr. 1, gefolgt von einem Doppelpunkt, irgendwo zuvor in der Zeichenfolge.
\b(\w+):?
: Vergleiche einen Bezeichner (von einer Wortgrenze zum nächsten :
), optional gefolgt von einem Doppelpunkt.
Zweiter Regex:
\b(\w+):
: Entspricht einem Bezeichner und einem Doppelpunkt.
(?=.*\b:?)
: Überprüfen Sie dann, ob Sie den gleichen Bezeichner, optional gefolgt von einem Doppelpunkt, irgendwo in der Zeichenfolge vorfinden können.
Hier ist eine awk-Version, keine regex erforderlich.
%Vor%Teilen Sie die Felder auf ":", gehen Sie durch die geteilten Felder, speichern Sie die Elemente in einem Array. auf Vorhandensein prüfen und falls vorhanden, überspringen. Sonst drucke sie aus. Sie können dies leicht in Perl-Code übersetzen.
Wenn die Bezeichner sortiert sind, können Sie dies mit Lookahead / Lookbehind tun. Wenn dies nicht der Fall ist, liegt dies jenseits der Rechenleistung einer Regex. Jetzt, nur weil es unmöglich mit formalen Regex ist, bedeutet es nicht, dass es unmöglich ist, wenn Sie eine Perl-spezifische Regex-Funktion verwenden, aber wenn Sie Ihre Regexes portabel halten möchten, müssen Sie diese Zeichenfolge in einer Sprache beschreiben, die Variablen unterstützt.
Tags und Links regex unique-values