String replaceAll

js-mueller

Erfahrenes Mitglied
Hi, ich hab ein Problem mit replace all und zwar ich hab folgenden String:

Code:
<!-- MSK-ABS:test -->
Test
<!-- MSK-ABS:test -->

Und nu möchte ich den gesamten Block mit test2 überschreiben, dazu hab ich folgende funktion mir ausgedacht

Code:
String puffer = this.rMSK_maskePuffer.replaceAll("/<!-- MSK-ABS:"+stelle+" -->(.*)<!-- MSK-ABS:"+stelle+" -->/m",wert);

Dies funktioniert aber nicht, ich denke mal es hängt mit der Zeilenübergreifenden sache zusammen odermit dem (.*).

Kann mir vieleicht jemand helfen?
 
Hallo Julian,

meinst du das etwa so?

Code:
public class Test {

	public static void main(String[] args) {
		String test = "<!-- MSK-ABS:test -->\nTest\n<!-- MSK-ABS:test -->";
		test = test.replaceAll("<!-- MSK-ABS:.+-->\n.+\n<!-- MSK-ABS:.+-->","wert");
		System.out.println(test);
	}
}

Vg Erdal
 
Das hatte leider auch nicht den gewünschten effekt :/
Und es ist auch nicht auf die 3 Zeilen beschränkt. "Test" kann auch ein langer Artikel sein.

edit:

Ich habs mal getestet alles in eine Zeile zuschreiben, dann geht es, also liegt es definitiv an der Mehrzeiligkeit. Da muss es doch ne Lösung geben oder?

edit2:

Ich hatte ja schon um den regulären Ausdruck /(...)/m gemaht, da das m ja eigentlich Mehrzeiligkeit unterstützen sollte, aber es funktioniert nicht :/
 
Zuletzt bearbeitet:
Wie wäre es mit
Code:
(<.*>)\n(.+)\n(<.*>)
Gruppe 1 hat dann die erste zeile, Gruppe2 die zweite und Gruppe 3 die dritte, oder wolltest du etwas anderes?

//edit
Was natürlich auch geht ist folgendes Konstrukt:
Code:
s.replaceAll("<.*>\n", "").replaceAll(".+\n", "Neuer Wert").replaceAll("<.*>", "");

//edit 2:
ok, habe gerade erst gelesen das es auch noch mehr Zeilen sein können.. hmm ich überlege mir was neues...

// edit 3:
also mit
Code:
.+\n{1,}
kriegt man auch mehrere Zeilen, das problem ist jetzt nur das dann da bei z.B. 4 Zeien auch 4x "Neuer Wert" steht, auch nicht ganz der gewünschte Effekt...
 
Zuletzt bearbeitet:
Hallo!

Schau mal hier:
Code:
  /**
   * 
   */
  package foo;
  
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  
  /**
   * @author daritho
   * 
   */
  public class StringReplaceExample {
  
  	/**
  	 * @param args
  	 */
  	public static void main(String[] args) {
  		String str = "a\n<!-- MSK-ABS:test -->\n"
 			 + "Test\nadhdasjkk\nhdasjkhasdjk\nasdghdaskhsdgajk\n"
 				+ "<!-- MSK-ABS:test -->\nb";
  
  		System.out.println(str);
  
  		System.out.println("-----------");
  
  		Pattern pattern = Pattern.compile("<!--.*-->", Pattern.DOTALL);
  		Matcher matcher = pattern.matcher(str);
  		System.out.println(matcher.replaceAll("FOO"));
  
  		//Oder hier irgendwie ?s einbauen ...
  		//System.out.println(str.replaceAll("<!--.*-->", "FOO"));
  	}
  
  }

Ausgabe:
Code:
 a
 <!-- MSK-ABS:test -->
 Test
 adhdasjkk
 hdasjkhasdjk
 asdghdaskhsdgajk
 <!-- MSK-ABS:test -->
 b
 -----------
 a
 FOO
 b

Gruss Tom
 
Danke Thomas, ich hoff das funktioniert, bin leider noch nicht in der Lage gewesen es zu teste, werd dies morgen aber wohl tun.


edit:

Hmm das funktioniert net so ganz wie ich es mir vorstelle.
Mit <!-- .* --> selektiert man ja vom ersten bis zum letzten HTML kommentar, aber ich möchte genau en abschnitt <!-- MSK-ABS:test -->.*<!-- MSK-ABS:test --> selektieren und ersetzen, da hab ich mir das überlegt: "<!-- MSK-ABS:"+stelle+"-->.*<!-- MSK-ABS:"+stelle+"-->", doch das funktioniert leider nicht.
 
Zuletzt bearbeitet:
Hallo!

Schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author tom
 * 
 */
public class StringReplaceExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String str = "a\n<!-- MSK-ABS:test -->\n"
                + "Test\nadhdasjkk\nhdasjkhasdjk\nasdghdaskhsdgajk\n"
                + "<!-- MSK-ABS:test -->\nb";
        str += str.replaceAll("test", "bar");

        System.out.println(str);

        System.out.println("-----------");

        String[] markers = { "test", "bar" };
        for (int i = 0; i < markers.length; i++) {
            String marker = markers[i];
            Pattern pattern = Pattern.compile("<!-- MSK-ABS:" + marker
                    + " -->.*<!-- MSK-ABS:" + marker + " -->", Pattern.DOTALL);
            Matcher matcher = pattern.matcher(str);
            str = matcher.replaceFirst(marker.toUpperCase());
        }
        System.out.println(str);
    }
}

Gruß Tom
 
Zurück