Ersetzen in Notepad++

laser2000
2013-06-25
2013-11-26
  • laser2000
    laser2000
    2013-06-25

    Hallo,

    ich möchte einen Ausdruck wie folgt ersetzen und komme einfach nicht weiter.
    IST: abc_xyz('\irgendwas')
    SOLL: efg_xyz('/\irgendwas/')

    Es soll also der Ausdruck "abc" durch "efg" ersetzt warden (ist ja noch einfach) UND es soll vor und nach dem "\irgendwas" jeweils ein "/" angefügt werden.
    Geht das mit notepad++ und wenn ja wie?
    Ich habe es schon mit diversen regulären Ausdrücken versucht, aber leider ohne Erfolg.

    Danke
    Michael

     
  • Straile
    Straile
    2013-06-25

    Hallo Michael

    Die richtige regex ist die da:
    Suchen nach: abc(.*)([\\]irgendwas.*)
    Ersetzen durch: efg\1/\2

    Zur Erklärung: Im Suchmuster sind die Teile, die aus dem Suchergebnis übernommen werden sollen eingeklammert - im Beispiel wäre das z.B. der Text _xyz('
    Diese eingeklammerten Teile werden ins Ergebnis der Ersetzung durch \1 oder \2 = erste Klammer, zweite Klammer übernommen.
    Weitere Hürde ist das \ nach dem du suchst - das ist ein eigentlich ein Steuerzeichen, du musst also der regex sagen das du hier wirklich den backslash als backslash und nicht als Sonderzeichen meinst. Deswegen steht im Suchmuster \\ und nicht \

    Gruß
    Achim

     
  • laser2000
    laser2000
    2013-06-26

    Hallo Achim,

    danke erstmal, aber so ganz erschließt sich mir das noch nicht.
    Vielleicht habe ich das auch etwas schlecht erklärt. Das "\irgendwas" liegt innerhalb von 2 Hochkommas und kann variieren, das kann also auch mal "\irgendwer" sein. Fix ist nur das "_xyz" und die beiden Hochkommas.

    Danke
    Michael

     
  • Straile
    Straile
    2013-06-26

    Hallo Michael

    Der erste Schritt ist das Suchmuster, damit musst du in der Lage sein zu finden was du finden willst. Wenn du schreibts das _xyz ein fixer Wert ist dann suchst du nach ._xyz
    .
    sind alle Zeichen die vor _xyz stehen, wenn du nach drei beliebigen Zeichen suchen wolltest ..._xyz (Punkt gleich ein beliebiges Zeichen, * beliebig oft, + mindestens ein Mal)
    Evtl. hilft es auch die beiden Ersetzungen nicht in einem Schritt zu machen sondern nacheinander.
    Im Ersetzungsmuster kannst du jetzt Teile des gefundenen Strings wieder einfügen, dazu dienen die Klammern im Suchmuster und das \1 im Erstzungsteil

    Wenn also der Teil vor _xyz (im Beispiel abc) durch def ersetzt werden soll und der Text in Klammer und Hochkomma ein vorgestelltes / bekommen soll heißt das
    Suchmuster: .*_xyz(.*)\('(.*)'\)
    Ersetzung: def_xyz\1('/\2')

    Die Schwierigkeit liegt daran das du nach den Zeichen ( und ) suchst und das aber Sonderzeichen für die regex sind - und deshalb in der regex durch ein vorgestelltes \ zu normalen Zeichen zurückgestuft werden müssen. Das macht das Suchmuster relativ unlesbar, aber es funktioniert..

    Gruß
    Achim

     
  • laser2000
    laser2000
    2013-06-26

    Hallo Armin,

    danke Dir, aber bei mir funzt das nicht so.
    Ich habe es jetzt zweigeteilt, dann ging es.
    Ich würde das Suchmuster aber gerne verstehen, der Ersetzungsteil ist mir klar.
    Ich versuche mal eine Analyse:
    IST: abc_xyz('\irgendwas')
    Suchmuster: ._xyz(.)('(.*)')

    . = ein Punkt ist 1 beliebiges Zeichen, * sind beliebig viele Zeichen. Wieso nehme ich hier nicht 3 Punkte für abc?
    (.
    ) = der erste String der nachher mit \1 ersetzt werden soll, alles nach dem xyz bis zum ersten Backslash?
    (' = bleibt fest stehen, also ändert sich nix
    (.*) = der zweite String der nachher mit \2 ersetzt werden soll, alles nach dem ersten ' bis zum zweiten '
    ') = Verstehe ich nicht, wozu ist der Backslash?

    Also im Prinzip verstehe ich (wenn meine Ausführungen richtig sind) die beiden Backslashs nicht so ganz. Das hängt ja mit dem zurückstufen auf "normale Zeichen" zusammen, oder? Aber wann und wie genau werden die gesetzt?

    Danke
    Michael

    Sehe gerade das der Post etwas abgeändert wird. Die * werden manchmal entfernt?!?

     
    Last edit: laser2000 2013-06-26
  • Straile
    Straile
    2013-06-26

    Hallo Michael

    Du bist glaube ich nah dran...

    warum .* und nicht ... -> ich weiß eben nicht ob es immer drei Zeichen sind - wenn es so ist kannst du ... nehmen, mit .* wird alles vor _xyz gelesen und durch abc erstetzt

    dann stimmt alles, bis zum letzten Punkt warum \)
    das muss \) sein weil ) ja für regex das Ende eines Teils ist den es sich merken soll. Wir suchen aber nach den Zeichen '), ist zufällig eine Klammer, soll aber nicht als Klammer interpretiert werden sondern als Zeichen, also musst du escapen (dafür sorgen das die Klammer nicht als Steuersignal verstanden wird)

    Hoffe du kannst jetzt verstehen

    Gruß
    Achim

     
  • laser2000
    laser2000
    2013-06-26

    Jo, dachte ich mir aber war mir nicht so ganz sicher.
    Der \ ist also für und vor beide Klammern zu setzen?
    Dann habe ich es jetzt verstanden.

    Danke
    Michael

     
  • Jolly
    Jolly
    2013-06-26

    siehe unten: war zu doof zum posten.

     
    Last edit: Jolly 2013-06-26
  • Jolly
    Jolly
    2013-06-26

    Hallo zusammen,
    ihr solltet in eure RegEx noch zwei Fragezeichen einfügen.
    Euer Suchmuster sollte bei den .* (Punkt-Stern) in .*? (Punkt-Stern-Fragezeichen) umgewandelt werden.
    nach .* zu suchen ist "gefährlich".
    im String:
    abc_xyz('Hallo Welt!'); bcd_xyz('Hello World')
    wird mit
    xyz.*'
    nicht
    xyz('
    gefunden, sondern
    xyz('Hallo Welt!'); bcd_xyz('Hello World'
    Vermutlich nicht was man wollte.

    .* sucht "greedy" (gefräßig) das heißt, es findet so lange wie möglich irgend ein Zeichen und bricht erst beim letzten möglichen nächsten Zeichen ab.
    .*? sucht lazy (faul) das heißt es bricht so früh wie möglich ab. Nämlich sobald das nächste Zeichen (bzw. die Zeichengruppe) gefunden ist.

    Wenn deine Suchtreffer alle in einer Zeile stehen, funktioniert die RegEx mit .* solange der Punkt nicht new line match (ein tolles Dinglisch ;-)

    Kannst ja mal das Häkchen im Suchen Dialog ".matches new line" setzen. Dann wirst du sehen, dass deine Ersetzung genau einmal zuschlägt und die ganze Datei rasiert.

    Hab mir noch vor nicht all zu langer Zeit mal das Tutorial auf www.regular-expressions.info reingezogen, dass fand ich ziemlich aufschlussreich. Falls jemand noch häufiger vor einem Problem steht, das er meint mit RegEx lösen zu können, kann ich das nur empfehlen!

    Gruß
    Jolly

     
  • Johann
    Johann
    2013-11-26

    Danke euch für das Thema und auch für die vielen Erklärungen. Da hätte ich mich viele Stunden, Tage, Wochen erspart, hätte ich euch schon früher getroffen.

    dicker Daumen

     
  • Johann
    Johann
    2013-11-26

    Und doch dürfte ich noch etwas falsch machen und freu mich, wenn mir jemand weiter helfen möchte.

    Kongretes Beispiel:

    Bestehender Text <a class='para'id='§VARIABLE' name='§VARIABLE' title=

    Sollte so dann so: <a class='para'id='para-VARIABLE' name='para-VARIABLE' title=

    Dieses habe ich mit:
    Suche nach: <a class='para'id='§(.)' name='§(.)' title
    oder suche nach: <a class='para'id='§(.?)' name='§(.?)' title
    und ersetze mit: <a class='para'id='para-\1' name='para-\2' title

    versucht, jedoch wurde nichts gefunden.

    Sucheinstellung ist auf "Erweitert" eingestellt.

    metta & mudita
    Johann

    (nach dem Punkt ist jeweil ein Stern, aber der wird hier nicht angezeigt ?? hmm...)

    Sucheinstellung: "Reguläre Ausdrücke"... jetzt wieß ich auch was mit "RegEx" gemeint ist.

    Funktioniert prima. Danke!!!

     
    Last edit: Johann 2013-11-26