/ / Regex, um alle Vorkommen eines bestimmten Zeichens zu ersetzen, NUR nach einem gegebenen Match - Regex, Perl, Replace

Regex, um alle Vorkommen eines bestimmten Zeichens zu ersetzen, NUR nach einem bestimmten Match - regex, perl, replace

Der Einfachheit halber sagen wir, dass wir Eingabestrings mit diesem Format haben:

*text1*|*text2*

Also möchte ich gehen Text 1 Alleine und entferne alle Leerzeichen in text2.

Das könnte einfach sein, wenn wir das nicht hätten Text 1, eine einfache Suche und Ersetzung wie folgt:

%s/s//g

aber in diesem Zusammenhang weiß ich nicht, was ich tun soll.

Ich habe versucht mit so etwas wie:

%s/(.*|S*).(.*)/12/g

was funktioniert, aber nur das erste Zeichen zu entfernen, meine ich, sollte dies für jeden beleidigenden Speicherplatz einmal in derselben Zeile ausgeführt werden.

Eine bevorzugte Einschränkung ist also zu lösen Sie dies mit nur einer Suche und ersetzen Sie es. Und obwohl ich die Vim-Syntax verwendet habe, verwenden Sie den regulären Ausdruck, mit dem Sie sich am wohlsten fühlen, um zu antworten. Vielleicht benötigen Sie einige Funktionen, die nur von Perl angeboten werden.

Bearbeiten: Meine Lösung für Vim:

%s:(|.*)@<=s::g

Antworten:

3 für die Antwort № 1

Ein Weg, in Perl:

s/(^.*||(?=s))s*/$1/g

Sicherlich ist eine wesentlich höhere Effizienz möglich, wenn Sie mehr als nur Suchen und Ersetzen zulassen.


3 für die Antwort № 2

Sie haben also eine Schnur mit einem Rohr (|), und Sie möchten nur die Leerzeichen ersetzen, die dem Rohr nicht vorangestellt sind?

s/s+(?![^|]*|)//g

0 für die Antwort № 3

Sie könnten versuchen, Perl-Code in einen regulären Ausdruck einzubetten (mit dem (?{...}) Syntax), die jedoch eher eine experimentelle Funktion ist und möglicherweise in Ihrem Szenario nicht funktioniert oder nicht verfügbar ist.

Dies

s/(.*?|)(.*)(?{ $x = $2; $x =~ s:s::g })/$1$x/

sollte theoretisch funktionieren, aber ich habe ein "Out of memory!" Fehler, der behoben werden kann, indem "s" durch ein Leerzeichen ersetzt wird:

s/(.*?|)(.*)(?{ $x = $2; $x =~ s: ::g })/$1$x/