Frage zu JavaScript-Regex-Replace

simusch

Aktives Mitglied
Thread Starter
Registriert
27.09.2004
Beiträge
2.332
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
Registriert
27.09.2004
Beiträge
2.332
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
Registriert
21.02.2014
Beiträge
1.293
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
Registriert
27.09.2004
Beiträge
2.332
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
Registriert
21.02.2014
Beiträge
1.293
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
Registriert
27.09.2004
Beiträge
2.332
WOW, vielen Dank!! Es scheint wirklich perfekt zu klappen!

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

Gruss Simon
 
Oben