Nur innerhalb des regex-Match ersetzen

Allgemeine Java-Themen: Nur innerhalb des regex-Match ersetzen

Allgemeine Themen, die nicht in andere Fachforen und nicht zu den Java Basics passen
  1. Nur innerhalb des regex-Match ersetzen #1
    TSH


    Nur innerhalb des regex-Match ersetzen - Standard Nur innerhalb des regex-Match ersetzen
    Hi,

    ich habe einen umfangreichen String text. Mit einem regex suche ich nach dem Pattern {@link org.domain.this.is.my.class }. Innerhalb jedes Matches, möchte ich "." durch ":" ersetzen.

    Der Code hier liefert fast das gewünschte. Allerdings werden die Punkte durch : ersetzt und dann der entsprechende Ausdruck "org.domain.this.is.my.class" im *ganzen* Text ersetze, auch außerhalb des {@link ... } Patterns. I weiss, dass Zeile 7 das Problem ist. Allerdings kenne ich nicht die Lösung Freue mich über jeden Tipp!

    Code:
    Pattern pattern = Pattern.compile("\\{@link (.*?)}");
    Matcher matcher = pattern.matcher(text);
    boolean moreOccurences = matcher.find();
    while (moreOccurences) {
        String origString = matcher.group(1);
        String replString = matcher.group(1).replace(".", ":");
        text = text.replace(origString, replString);
        moreOccurences = matcher.find();
    }

  2. Nur innerhalb des regex-Match ersetzen #2
    Mujahiddin


    Zitat Zitat von TSH Beitrag anzeigen
    Hi,

    ich habe einen umfangreichen String text. Mit einem regex suche ich nach dem Pattern {@link org.domain.this.is.my.class }. Innerhalb jedes Matches, möchte ich "." durch ":" ersetzen.

    Der Code hier liefert fast das gewünschte. Allerdings werden die Punkte durch : ersetzt und dann der entsprechende Ausdruck "org.domain.this.is.my.class" im *ganzen* Text ersetze, auch außerhalb des {@link ... } Patterns. I weiss, dass Zeile 7 das Problem ist. Allerdings kenne ich nicht die Lösung Freue mich über jeden Tipp!

    Code:
    Pattern pattern = Pattern.compile("\\{@link (.*?)}");
    Matcher matcher = pattern.matcher(text);
    boolean moreOccurences = matcher.find();
    while (moreOccurences) {
        String origString = matcher.group(1);
        String replString = matcher.group(1).replace(".", ":");
        text = text.replace(origString, replString);
        moreOccurences = matcher.find();
    }
    Fehlt in Zeile 1 nicht "\\" vor "}"?

    E: der gesamte Ausdruck muss lauten:
    Pattern.compile("(\\{@link .*?\\})");
    Die catching group, die nur auf den Link ausgerichtet ist, lässt bei der Methode [C]text.replace[/C] alle Strings in [C]text[/C] ersetzen.

  3. Nur innerhalb des regex-Match ersetzen #3
    TSH


    OK, das mit dem Ausdruck hab ich verstanden. Aber den letzten Satz leider nicht. Hast Du einen Tipp, wie ich innerhalb von text nur innerhalb der jeweiligen group ersetze?

  4. Nur innerhalb des regex-Match ersetzen #4
    Mujahiddin


    Zitat Zitat von TSH Beitrag anzeigen
    OK, das mit dem Ausdruck hab ich verstanden. Aber den letzten Satz leider nicht. Hast Du einen Tipp, wie ich innerhalb von text nur innerhalb der jeweiligen group ersetze?
    Macht das der Code nicht?
    Gib am besten mal einen Beispielstext und was rauskommt und was rauskommen soll.
    Die momentane Version ersetzt jeden Punkt in [C]{@link .*?}[/C] mit einem Doppelpunkt. Oder nicht?

  5. Nur innerhalb des regex-Match ersetzen #5
    TSH


    Zitat Zitat von Mujahiddin Beitrag anzeigen
    Die momentane Version ersetzt jeden Punkt in [C]{@link .*?}[/C] mit einem Doppelpunkt. Oder nicht?
    Folgendes Beispiel:

    "Klasse org.domain.x hat den Link {@link org.domain.x}."

    Gematched wird nur der 2. Teil. Dann aber *jedes* Vorkommen im gesamten Text ausgetauscht. Beim ersten soll aber alles beim alten bleiben.

  6. Nur innerhalb des regex-Match ersetzen #6
    Werzi2001


    Meines Wissens nach lässt sich ein "Nur innerhalb eines Matches ersetzen" mit RegExp alleine nicht formulieren und muss normalerweise mit Programmlogiken umgesetzt werden. In deinem Fall sollte es aber eigentlich reichen wenn du deine 7. Zeile durch folgendes ersetzt:
    Java Code:
    1.  
    2. text = text.replace(matcher.group(), "{@link " + replString + "}");


    Grüße
    Thomas

  7. Nur innerhalb des regex-Match ersetzen #7
    Mujahiddin


    @OP:
    Mein Code soll ja genau das verhindern.
    In deinem Code hast du folgende Regex:
    Code:
    \\{@link (.*?)\\}
    Dort ist die Catching Group nach {@link und vor }. Das bedeutet. dein [C]matcher.group()[/C] liefert den Link und nur den Link.
    Wenn du aber folgende Regex anwendest:
    Code:
    (\\{@link .*?\\})
    dann nimmt er alles in die Group, also liefert [C]matcher.group()[/C] den link und die benötigte Bedingung, um die Punkte zu ersetzen. Also bleibt der Rest von [C]text[/C] unberührt.

    @über mir: Das ist redundant und sollte vermieden werden.

    E: Zur Veranschaulichung ein Beispiel:

    Es sei der String [C]Klasse org.domain.x hat den Link {@link org.domain.x}.[/C]
    Mit Regex1 macht er folgende Schritte:
    Java Code:
    1. String origString = matcher.group(1); // "org.domain.x"
    2. String replString = matcher.group(1).replace(".", ":"); // "org.domain.x" -> "org:domain:x" (überall!)

    Regex2:
    Java Code:
    1. String origString = matcher.group(1); // "{@link org.domain.x}"
    2. String replString = matcher.group(1).replace(".", ":"); // "{@link org.domain.x}" -> "{@link org:domain:x}"

  8. Nur innerhalb des regex-Match ersetzen #8
    TSH


    Danke Euch beiden! Das hier tut's nun:
    Code:
    		Pattern pattern = Pattern.compile("(\\{@link .*?\\})");
    		Matcher matcher = pattern.matcher(text);
    		boolean moreOccurences = matcher.find();
    		while (moreOccurences) {
    			String origString = matcher.group();
    			String replString = matcher.group().replace(".", ":");
    			text = text.replace(origString, replString);
    			moreOccurences = matcher.find();
    		}

  9. Nur innerhalb des regex-Match ersetzen #9
    Werzi2001


    @Mujahiddin:
    Ja stimmt ist redundant. Allerdings braucht es die Capturing Group in diesem Fall gar nicht, da sowieso der komplette Treffer verwendet werden soll. Es kann also einfach ".group()" oder ".group(0)" verwendet werden.
    Java Code:
    1.  
    2. String origString = matcher.group();
    3. String replString = matcher.group().replace(".", ":");
    4. text = text.replace(origString, replString);


    Grüße
    Thomas

  10. Nur innerhalb des regex-Match ersetzen #10
    Mujahiddin


    Zitat Zitat von Werzi2001 Beitrag anzeigen
    @Mujahiddin:
    Ja stimmt ist redundant. Allerdings braucht es die Capturing Group in diesem Fall gar nicht, da sowieso der komplette Treffer verwendet werden soll. Es kann also einfach ".group()" oder ".group(0)" verwendet werden.
    Java Code:
    1.  
    2. String origString = matcher.group();
    3. String replString = matcher.group().replace(".", ":");
    4. text = text.replace(origString, replString);


    Grüße
    Thomas
    Stimmt, man lernt immer dazu!

    Was mir noch auffällt: Besser wäre auch [C]String replString = origString.replace(".", ":");[/C] statt [C]String replString = matcher.group().replace(".", ":");[/C]

  • Javavideokurs
    Videokurs
    Dein Weg zum Java-Profi!
    25 Stunden geballtes Java Know-How.

    Videokurs

  • Ähnliche Themen zu Nur innerhalb des regex-Match ersetzen
    1. String match mit Wildcard ODER Regex
      Von wersi77 im Forum Java Basics - Anfänger-Themen
      Antworten: 1
      Letzter Beitrag: 18.12.2013, 20:00
    2. Klassen innerhalb einer jar ersetzen
      Von Xandaros im Forum Allgemeine Java-Themen
      Antworten: 2
      Letzter Beitrag: 15.06.2011, 13:48
    3. Regex + Match Zahlen filtern
      Von Java4Life im Forum Java Basics - Anfänger-Themen
      Antworten: 5
      Letzter Beitrag: 14.12.2010, 10:55
    4. string.match[regex] - Help !
      Von enHanced im Forum Java Basics - Anfänger-Themen
      Antworten: 2
      Letzter Beitrag: 26.11.2010, 15:50
    5. Regex Match oder so
      Von Sanix im Forum Java Basics - Anfänger-Themen
      Antworten: 7
      Letzter Beitrag: 30.09.2005, 11:37
    Sie betrachten gerade Nur innerhalb des regex-Match ersetzen