Frage zu JavaScript-Regex-Replace

simusch

Aktives Mitglied
Thread Starter
Dabei seit
27.09.2004
Beiträge
2.029
Punkte Reaktionen
218
Hallo zusammen,

ich stehe vor einem relativ kleinen Problem mit einer JavaScript-Regex und komme nicht weiter...

Ich möchte auf Knopfdruck den Inhalt einer Textarea umformen. Dabei sollen gewisse Formatierungs-Zeichen erhalten bleiben.

Der Inhalt der Textarea vor dem Ausführen:

Code:
A
#B\
C
#D
/
E
#F\
G
#H

Die Aktion soll jeweils zwei aufeinanderfolgende Zeilen vertauschen, die #, / und \ jedoch nicht verschieben:

Code:
B
#A\
D
#C
/
F
#E\
H
#G

Ich habe es mit folgender Regex geschafft, die Zeilen zu tauschen, die # am Ort zu lassen. Jedoch scheitere ich mit den \ am Ende der Zeile:
WICHTIG: die Backslash \ sind nicht zwingend vorhanden.

Javascript:
content = content.replace(/^(.*)\n#(.*)$/mg, '$2\n#$1');

Wenn ich da irgendwo noch eine Abfrage nach Backslash einbauen möchte (egal wie ich sie escape) geht nichts mehr...

Ich habe hier einen Pen erstellt: https://codepen.io/simusch/pen/BaprEYL
Jetzt sollten einfach gesagt beim Klick auf Switch die \ einfach am Ort bleiben :)

Danke für eure Hilfe :)

Simon
 

simusch

Aktives Mitglied
Thread Starter
Dabei seit
27.09.2004
Beiträge
2.029
Punkte Reaktionen
218
Die Zeile mit dem / wird in meinem Beispiel ignoriert - das soll auch so sein...

Du hast recht, das habe ich zu ungenau beschrieben.
 

Deine Mudda

Aktives Mitglied
Dabei seit
21.02.2014
Beiträge
1.819
Punkte Reaktionen
3.141
Ist mir immer noch nicht klar: ist das "/"-Zeichen hier gesondert zu behandeln oder generell Zeilen, die nur "#", "/" und/oder "\" enthalten?
 

simusch

Aktives Mitglied
Thread Starter
Dabei seit
27.09.2004
Beiträge
2.029
Punkte Reaktionen
218
Im Prinzip soll jede zweite Zeile behandelt werden, sofern es nicht eine Zeile mit nur einem / ist.

Es könnte auch ein Sonderfall auftreten, wo das / zu Beginn oder am Ende einer Zeile ist, dies ebenfalls zu berücksichtigen, wäre aber wohl zu viel des Guten...

Code:
A
#B\
C
#D
/E
#F\
G
#H

oder

A
#B\
C
#D/
E
#F\
G
#H

würde dann zu:

Code:
B
#A\
D
#C
/F
#E\
H
#G

resp.

B
#A\
D
#C/
F
#E\
H
#G
 

Deine Mudda

Aktives Mitglied
Dabei seit
21.02.2014
Beiträge
1.819
Punkte Reaktionen
3.141
content = content.replace(/^(\/\n)?([^\n]*)\n#([^\\\/\n]*)([\\\/]?)?$/mg, '$1$3\n#$2$4');

Edith meint
content = content.replace(/^(\/\n)*(\/)?([^\n]*)\n#([^\\\/\n]*)([\\\/]?)?$/mg, '$1$2$4\n#$3$5');


So würden die obigen Beispiele funktionieren.
(Den ersten "*" müsste man durch "?" ersetzen, wenn keine zwei oder mehr aufeinanderfolgenden "/"-Zeilen zulässig sind)

Ich bin aber nicht so der Regex-Künstler und vermutlich würde ich für sowas einen Parser (https://pegjs.org) nehmen.
yesterdays-regex-drunk-genius.jpg
 
Zuletzt bearbeitet:

simusch

Aktives Mitglied
Thread Starter
Dabei seit
27.09.2004
Beiträge
2.029
Punkte Reaktionen
218
WOW, vielen Dank!! Es scheint wirklich perfekt zu klappen!

Ich würde schon sagen es geht in Richtung "Genius" ;)

Gruss Simon
 
Oben Unten