Nur innerhalb des regex-Match ersetzen

Diskutiere Nur innerhalb des regex-Match ersetzen im Allgemeine Java-Themen Forum; Hi, ich habe einen umfangreichen String text. Mit einem regex suche ich nach dem Pattern {@link org.domain.this.is.my.class }. Innerhalb jedes...

  1. TSH
    TSH Mitglied
    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 (Text):
    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. Vielleicht hilft dir das kostenlose Training weiter --> (hier klicken)
  3. Mujahiddin
    Mujahiddin Neues Mitglied
    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
    Code (Text):
    text.replace
    alle Strings in
    Code (Text):
    text
    ersetzen.
     
    Zuletzt bearbeitet: 27. Juli 2012
  4. TSH
    TSH Mitglied
    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?
     
  5. Mujahiddin
    Mujahiddin Neues Mitglied
    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
    Code (Text):
    {@link .*?}
    mit einem Doppelpunkt. Oder nicht?
     
  6. TSH
    TSH Mitglied
    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.
     
  7. Werzi2001
    Werzi2001 Neues Mitglied
    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:
    Code (Java):

    text = text.replace(matcher.group(), "{@link " + replString + "}");
    Grüße
    Thomas
     
  8. Mujahiddin
    Mujahiddin Neues Mitglied
    @OP:
    Mein Code soll ja genau das verhindern.
    In deinem Code hast du folgende Regex:
    Code (Text):
    \\{@link (.*?)\\}
    Dort ist die Catching Group nach {@link und vor }. Das bedeutet. dein
    Code (Text):
    matcher.group()
    liefert den Link und nur den Link.
    Wenn du aber folgende Regex anwendest:
    Code (Text):
    (\\{@link .*?\\})
    dann nimmt er alles in die Group, also liefert
    Code (Text):
    matcher.group()
    den link und die benötigte Bedingung, um die Punkte zu ersetzen. Also bleibt der Rest von
    Code (Text):
    text
    unberührt.

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

    E: Zur Veranschaulichung ein Beispiel:

    Es sei der String
    Code (Text):
    Klasse org.domain.x hat den Link {@link org.domain.x}.
    Mit Regex1 macht er folgende Schritte:
    Code (Java):
    String origString = matcher.group(1); // "org.domain.x"
    String replString = matcher.group(1).replace(".", ":"); // "org.domain.x" -> "org:domain:x" (überall!)
    Regex2:
    Code (Java):
    String origString = matcher.group(1); // "{@link org.domain.x}"
    String replString = matcher.group(1).replace(".", ":"); // "{@link org.domain.x}" -> "{@link org:domain:x}"
     
    Zuletzt bearbeitet: 27. Juli 2012
  9. TSH
    TSH Mitglied
    Danke Euch beiden! Das hier tut's nun:
    Code (Text):
            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();
            }
     
    Zuletzt bearbeitet: 27. Juli 2012
  10. Werzi2001
    Werzi2001 Neues Mitglied
    @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.
    Code (Java):

    String origString = matcher.group();
    String replString = matcher.group().replace(".", ":");
    text = text.replace(origString, replString);
    Grüße
    Thomas
     
  11. Mujahiddin
    Mujahiddin Neues Mitglied
    Stimmt, man lernt immer dazu!

    Was mir noch auffällt: Besser wäre auch
    Code (Text):
    String replString = origString.replace(".", ":");
    statt
    Code (Text):
    String replString = matcher.group().replace(".", ":");
     
  12. Schau dir jetzt hier den Kurs an und lerne Java zu programmieren: --> Hier klicken, um mehr zu erfahren (Klick)
Die Seite wird geladen...

Nur innerhalb des regex-Match ersetzen - Ähnliche Themen

Code 'innerhalb' des synchronen Bereichs einer BlockingQueue ausfuehren..?
Code 'innerhalb' des synchronen Bereichs einer BlockingQueue ausfuehren..? im Forum Allgemeine Java-Themen
Nanosekunden-Pause innerhalb einen Thread-Loops
Nanosekunden-Pause innerhalb einen Thread-Loops im Forum Allgemeine Java-Themen
BufferedWriter innerhalb einer Methode
BufferedWriter innerhalb einer Methode im Forum Java Basics - Anfänger-Themen
Innerhalb einer Methode eine Variable der aufrufenden Methode ändern?
Innerhalb einer Methode eine Variable der aufrufenden Methode ändern? im Forum Java Basics - Anfänger-Themen
TAB Taste innerhalb eines JSpinner
TAB Taste innerhalb eines JSpinner im Forum AWT, Swing, JavaFX & SWT
Thema: Nur innerhalb des regex-Match ersetzen