Nur innerhalb des regex-Match ersetzen

TSH

Bekanntes 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:
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();
}
 

Mujahiddin

Top Contributor
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
Code:
text.replace
alle Strings in
Code:
text
ersetzen.
 
Zuletzt bearbeitet:

TSH

Bekanntes 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?
 

Mujahiddin

Top Contributor
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
Code:
{@link .*?}
mit einem Doppelpunkt. Oder nicht?
 

TSH

Bekanntes Mitglied
Die momentane Version ersetzt jeden Punkt in
Code:
{@link .*?}
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.
 

Werzi2001

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:
Java:
text = text.replace(matcher.group(), "{@link " + replString + "}");

Grüße
Thomas
 

Mujahiddin

Top Contributor
@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
Code:
matcher.group()
liefert den Link und nur den Link.
Wenn du aber folgende Regex anwendest:
Code:
(\\{@link .*?\\})
dann nimmt er alles in die Group, also liefert
Code:
matcher.group()
den link und die benötigte Bedingung, um die Punkte zu ersetzen. Also bleibt der Rest von
Code:
text
unberührt.

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

E: Zur Veranschaulichung ein Beispiel:

Es sei der String
Code:
Klasse org.domain.x hat den Link {@link org.domain.x}.
Mit Regex1 macht er folgende Schritte:
Java:
String origString = matcher.group(1); // "org.domain.x"
String replString = matcher.group(1).replace(".", ":"); // "org.domain.x" -> "org:domain:x" (überall!)
Regex2:
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:

TSH

Bekanntes Mitglied
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();
		}
 
Zuletzt bearbeitet:

Werzi2001

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.
Java:
String origString = matcher.group();
String replString = matcher.group().replace(".", ":");
text = text.replace(origString, replString);

Grüße
Thomas
 

Mujahiddin

Top Contributor
@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:
String origString = matcher.group();
String replString = matcher.group().replace(".", ":");
text = text.replace(origString, replString);

Grüße
Thomas

Stimmt, man lernt immer dazu!

Was mir noch auffällt: Besser wäre auch
Code:
String replString = origString.replace(".", ":");
statt
Code:
String replString = matcher.group().replace(".", ":");
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
Zrebna Möglichkeit regelmäßige indentation mittels/innerhalb Stringbuilder Allgemeine Java-Themen 14
E Elemente innerhalb einer ArrayList vergleichen Allgemeine Java-Themen 33
ReinerCoder auf Klassen innerhalb eines package zugreifen Allgemeine Java-Themen 22
S Zugriff auf jUnit Test Suite Runner-Instanzen innerhalb von Test Classes Allgemeine Java-Themen 7
S Code 'innerhalb' des synchronen Bereichs einer BlockingQueue ausfuehren..? Allgemeine Java-Themen 7
M Nanosekunden-Pause innerhalb einen Thread-Loops Allgemeine Java-Themen 3
L Bilder innerhalb der JAR Datei Allgemeine Java-Themen 2
B Datei innerhalb des JARs von einer statischen Methode aufrufen Allgemeine Java-Themen 4
A Navigation zu Files innerhalb jar Allgemeine Java-Themen 3
C Prüfen ob sich ein Punkt innerhalb einer Kugel befindet (Java3D,nicht-lineare GLS) Allgemeine Java-Themen 5
X Klassen innerhalb einer jar ersetzen Allgemeine Java-Themen 2
P Threads Thread innerhalb einer Klasse - ohne Extra Klasse Allgemeine Java-Themen 9
C 1500 Minuten innerhalb von 24h ?!?! Allgemeine Java-Themen 4
S groesstes Rechteck innerhalb eines Polygons/Shape finden..? Allgemeine Java-Themen 5
X Codeabarbeitung innerhalb des Hauptprogramms für bestimmte Zeit unterbrechen Allgemeine Java-Themen 2
M verschiedene Methonden innerhalb des gleichen Threads Allgemeine Java-Themen 7
J InvocationException im Thread (innerhalb von call() einer Callable Klasse) Allgemeine Java-Themen 2
J Directory/File Listing innerhalb JAR Allgemeine Java-Themen 2
P Serialisiertes Objekt innerhalb einer XML Node Allgemeine Java-Themen 25
M Innerhalb einer Jar in eine Txt schreiben Allgemeine Java-Themen 2
D Exe innerhalb einer Jar starten Allgemeine Java-Themen 10
U alle Dateien eines Ordners innerhalb einer JAR auflisten Allgemeine Java-Themen 6
N .jar innerhalb einer javaDatei starten Allgemeine Java-Themen 3
Luma Arbeitsverzeichnis innerhalb externen Bibliothek ändern Allgemeine Java-Themen 2
K MANIFEST.MF innerhalb einer JAR Datei lesen. Allgemeine Java-Themen 4
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
N Auf Bilder / Dateien innerhalb eines jar-Archives zugreifen Allgemeine Java-Themen 2
H Ein zufälliges Datum innerhalb eines Intervalles erzeugen Allgemeine Java-Themen 3
D Zahlen innerhalb eines Strings auslesen Allgemeine Java-Themen 3
D Suchfunktion innerhalb Jeditorpane Allgemeine Java-Themen 6
B java-version bestimmen innerhalb von Programm Allgemeine Java-Themen 4
A Verzeichnis auflisten - auch innerhalb eines Jars Allgemeine Java-Themen 6
M Datei innerhalb eines Zips ausführen? Allgemeine Java-Themen 4
P Perl innerhalb von Java ausführen Allgemeine Java-Themen 2
E Schaffe es einfach nicht daten innerhalb von 2 klassen zu üb Allgemeine Java-Themen 4
S konstruktor nur innerhalb der klasse aufrufbar Allgemeine Java-Themen 5
H Frage regex greater than less than Allgemeine Java-Themen 7
N Regex schlägt nicht an Allgemeine Java-Themen 10
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
T regex case insensitive trimmed Allgemeine Java-Themen 6
S Zeichen | in regex Allgemeine Java-Themen 8
X Regex mit mehreren Bedingungen machen Allgemeine Java-Themen 5
N Hilfe bei RegEx benötigt Allgemeine Java-Themen 3
C Java17 und Regex Allgemeine Java-Themen 13
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N E-Mail Validator (ohne Regex!) Allgemeine Java-Themen 7
OnDemand Regex von bis Allgemeine Java-Themen 6
W Versionsnummer auslesen - Regex ist zickig Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
G Regex Allgemeine Java-Themen 2
L regex ganzer string? Allgemeine Java-Themen 2
MiMa Geldbetrag mit regex ermitteln. Allgemeine Java-Themen 14
W RegEx Stringliteral finden - Jflex Allgemeine Java-Themen 5
D Regex Probleme Allgemeine Java-Themen 2
Kirby.exe Regex charakter ignorieren Allgemeine Java-Themen 12
S Java SAT (Haltbarkeitsproblem) mit Regex Allgemeine Java-Themen 6
S [Regex] Nur diese Zeichen beachten Allgemeine Java-Themen 1
M Bitte Hilfe mit REGEX (Negieren) Allgemeine Java-Themen 4
J Compilerfehler bis in java.util.regex.Pattern... Allgemeine Java-Themen 2
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
S Regex mit UND-Verknüpfung Allgemeine Java-Themen 1
P RegEx für Zeiten Allgemeine Java-Themen 7
D Regex: Komplettes Wort bekommen Allgemeine Java-Themen 3
Neumi5694 Operatoren regEx für das Erstellen eines Strings verwenden Allgemeine Java-Themen 3
P RegEx Allgemeine Java-Themen 3
W String Parsen und auf eigenes Muster anwenden (kein Regex) Allgemeine Java-Themen 11
Y regex | n-faches Vorkommen oder gar keins Allgemeine Java-Themen 6
turmaline Regex gegen Regex prüfen Allgemeine Java-Themen 4
HarleyDavidson Regex - Optimierung Allgemeine Java-Themen 4
M Regex für Zahleneingabe in JavaFX Textfield Allgemeine Java-Themen 18
T Best Practice Wortregeln RegEx Allgemeine Java-Themen 11
A ALTER TABLE mit Hilfe von RegEx zerlegen, splitten Allgemeine Java-Themen 5
H Interpreter-Fehler Regex kompiliert nicht Allgemeine Java-Themen 5
M RegEx alle Matches ausgeben Allgemeine Java-Themen 5
Iron Monkey Mit Regex nach Beträge suchen Allgemeine Java-Themen 4
T REGEX Erklaerung Allgemeine Java-Themen 14
H Pic Download / Regex Problem Allgemeine Java-Themen 7
F Frage zu Regex möglich Allgemeine Java-Themen 4
M Regex... mal wieder Allgemeine Java-Themen 3
H RegEx - Ersetze alles bis Leerzeichen Allgemeine Java-Themen 5
S regex verbrät CPU Allgemeine Java-Themen 6
V Regex Bereichs Filter Allgemeine Java-Themen 4
127.0.0.1 RegEx _ und 0-9 Allgemeine Java-Themen 45
S Entfernen von allen Nicht-Buchstaben chars aus einem String ohne Regex..? Allgemeine Java-Themen 10
P Java String Regex Allgemeine Java-Themen 2
AyKay Regex XPath Allgemeine Java-Themen 4
C Regex (Case insensitive und Umlaute) Allgemeine Java-Themen 4
D Regex Raute erkennen Allgemeine Java-Themen 2
nrg Zweistelligen Zahlenbereich mit RegEx Allgemeine Java-Themen 8
GilbertGrape Regex-Problem Allgemeine Java-Themen 2
W Denkblockade RegEx Allgemeine Java-Themen 2
S eigene regEx schreiben Allgemeine Java-Themen 4
C Regex expandieren Allgemeine Java-Themen 6
C Regex Überschniedung von Ausdrücken Allgemeine Java-Themen 16
reibi RegEX - Teilstring Allgemeine Java-Themen 6
R Java-RegEx terminiert nicht Allgemeine Java-Themen 3
M Regex: Ich stehe auf dem Schlauch Allgemeine Java-Themen 2
V Kleines Regex-Problem Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben