Mit welchem ​​regulären Ausdruck können doppelte Elemente aus einer Zeichenfolge entfernt werden?

8

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

angeben

Hinweis: Ich bin in Perl programmiert, aber ich würde sehr gerne eine Regex dafür verwenden.

    
Tom 22.07.2010, 14:16
quelle

5 Antworten

8

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.

    
Tim Pietzcker 22.07.2010, 14:43
quelle
2

Check out: Ссылка

Immer eine nützliche Seite, wenn Sie über einen regulären Ausdruck nachdenken.

    
Noon Silk 22.07.2010 14:18
quelle
1
%Vor%

Ausgabe:

%Vor%     
Toto 22.07.2010 14:42
quelle
0

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.

    
ghostdog74 22.07.2010 14:44
quelle
0

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.

    
Dan Monego 22.07.2010 14:37
quelle

Tags und Links