2016-08-01 32 views
-2

Ich bin eine einzige UNIX/Perl/PHP-Stil reguläre Ausdrücke die folgenden mit einer Liste von Text-Strings zu tun sucht:Regex umbenennen/ändern doppelte Zeilen

  • Suche nach der ersten Zeile, die mit beginnt das '#' Zeichen
  • Ändern Sie alle Zeichenfolgen mit weiteren Vorkommen der Suchzeichenfolge, aber ohne die '#' am Anfang, damit die Zeilen auch mit '#' beginnen würden. Solche Zeilen können nachgestellten Text haben (aber nicht unbedingt tun).

Das muss in einem Pfad erfolgen.

Z. B .:

some line 
# some string 
some line 
some line 
some line 
some string some other string 
some line 
some line 
some string 
some line 
some line 
some line 
some string some trailing text 
some line 

Regex101

Also, was ich suche ist ein regulärer Ausdruck, der die Linie # some string und fügen Sie dann # am Anfang der anderen Linien entsprechen würde, die mit some string starten. Die Linien, die abgestimmt werden würde und sind modifiziert,

  • some string some other string -># some string some other string
  • some string -># some string
  • some string some trailing text -># some string some trailing text

ich im Sinn hatte, für so etwas wie ^(#?[^\r\n]+$)[\s\S]*(^\1[^\r\n]*$)+ tun passende alle diese Vorkommen, aber ich muss dies teilen, um jedes einzelne Vorkommen zu ersetzen ...

Danke.

+1

Was regex Sie bisher versucht haben? – AbhiNickz

+0

'^ (#? [^ \ R \ n] + $) ([\ s \ S] *) (^ \ 1 [^ \ r \ n] * $) +' – hoonose

Antwort

1

Der Versuch, dies als eine einzige Regex zu schreiben, klingt wie ein Rezept für nicht zu erhaltenden Code. Ich würde es so schreiben:

my $prefix; 
while (<>) { 
    # If we find a line that starts with #, then set $prefix 
    if (/^# (.*)/) { 
    $prefix = $1; 
    } 

    # If $prefix is defined and we find a line that starts with $prefix, 
    # then prepend '#' 
    if (defined $prefix and /^$prefix/) { 
    $_ = "$prefix $_"; 
    } 

    print; 
} 
+0

Danke dafür. Dies ist jedoch nicht für den Code gedacht, sondern als Schritt für ein Texteditor-Makro, weshalb es notwendig ist, es in einem Durchgang auszuführen. Wenn ich einen Zyklus hätte benutzen können, hätte ich das getan. – hoonose

+0

Es ist wahrscheinlich eine gute Idee, solche Einschränkungen zu erwähnen, wenn Sie Ihre Frage stellen. –

+0

Dave, wirklich, danke, aber ich habe nach einem Regexp gefragt, anstatt Code. – hoonose

0

Ein variabler Blick hinter wäre toll für diese.
Aber die meisten Regex-Engines unterstützen das nicht. Nur der feste Blick dahinter.

Allerdings, wenn Sie diese Liste von Zeichenfolgen umkehren können.
Dann könnten Sie wahrscheinlich noch einen positiven Lookahead auf den umgekehrten Text verwenden. Und kehren Sie den Text nach dem Ersetzen zurück.

Ein sehr vereinfachtes Beispiel.

Wir beginnen mit dem Text:

z 
# a 
a y 
a 
x 

Jetzt umkehren wir den Text:

x 
a 
y a 
a # 
z 

Jetzt ersetzen wir alle (global, mehrzeilige)
(\w+$)(?=[\s\S]+\1 ?#)
von \0 #.

Und wir bekommen:

x 
a # 
y a # 
a # 
z 

nun das Ergebnis umgekehrt:

z 
# a 
# a y 
# a 
x