Java-Forum.org  

Zurück   Java-Forum.org > Java - Programmierung > Allgemeine Java-Themen

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

Allgemeine Themen, die nicht in andere Fachforen und nicht zu den Java Basics passen

Antwort     Ist dieses Thema erledigt?
Themen-Optionen Thema durchsuchen Ansicht
Alt 27.07.2012, 15:00   #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();
}
 

 
Anzeige
 

AW: Nur innerhalb des regex-Match ersetzen



 
Alt 27.07.2012, 15:03   #2
Mujahiddin
 
Nur innerhalb des regex-Match ersetzen - Standard AW: Nur innerhalb des regex-Match ersetzen

Zitat: 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 text.replace alle Strings in text ersetzen.
 
Alt 27.07.2012, 15:23   #3
TSH
Themenstarter
 
Nur innerhalb des regex-Match ersetzen - Standard AW: Nur innerhalb des regex-Match ersetzen

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?
 
Alt 27.07.2012, 15:28   #4
Mujahiddin
 
Nur innerhalb des regex-Match ersetzen - Standard AW: Nur innerhalb des regex-Match ersetzen

Zitat: 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 {@link .*?} mit einem Doppelpunkt. Oder nicht?
 
Alt 27.07.2012, 15:34   #5
TSH
Themenstarter
 
Nur innerhalb des regex-Match ersetzen - Standard AW: Nur innerhalb des regex-Match ersetzen

Zitat: Mujahiddin
Beitrag anzeigen
Die momentane Version ersetzt jeden Punkt in {@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.
 
Alt 27.07.2012, 15:37   #6
Werzi2001
 
Nur innerhalb des regex-Match ersetzen - Standard AW: Nur innerhalb des regex-Match ersetzen

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: Quelltext in neuem Fenster öffnen
  1. text = text.replace(matcher.group(), "{@link " + replString + "}");

Grüße
Thomas
 
Alt 27.07.2012, 15:42   #7
Mujahiddin
 
Nur innerhalb des regex-Match ersetzen - Standard AW: Nur innerhalb des regex-Match ersetzen

@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 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 matcher.group() den link und die benötigte Bedingung, um die Punkte zu ersetzen. Also bleibt der Rest von text unberührt.

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

E: Zur Veranschaulichung ein Beispiel:

Es sei der String Klasse org.domain.x hat den Link {@link org.domain.x}.
Mit Regex1 macht er folgende Schritte:
Java Code: Quelltext in neuem Fenster öffnen
  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: Quelltext in neuem Fenster öffnen
  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}"
 
Alt 27.07.2012, 15:44   #8
TSH
Themenstarter
 
Nur innerhalb des regex-Match ersetzen - Standard AW: Nur innerhalb des regex-Match ersetzen

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();
		}
 
Alt 27.07.2012, 15:48   #9
Werzi2001
 
Nur innerhalb des regex-Match ersetzen - Standard AW: Nur innerhalb des regex-Match ersetzen

@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: Quelltext in neuem Fenster öffnen
  1. String origString = matcher.group();
  2. String replString = matcher.group().replace(".", ":");
  3. text = text.replace(origString, replString);

Grüße
Thomas
 
Alt 27.07.2012, 15:52   #10
Mujahiddin
 
Nur innerhalb des regex-Match ersetzen - Standard AW: Nur innerhalb des regex-Match ersetzen

Zitat: 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: Quelltext in neuem Fenster öffnen
  1. String origString = matcher.group();
  2. String replString = matcher.group().replace(".", ":");
  3. text = text.replace(origString, replString);

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

Was mir noch auffällt: Besser wäre auch String replString = origString.replace(".", ":"); statt String replString = matcher.group().replace(".", ":");
 
Antwort     Ist dieses Thema erledigt?

Zurück   Java-Forum.org > Java - Programmierung > Allgemeine Java-Themen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen: Nur innerhalb des regex-Match ersetzen

String match mit Wildcard ODER Regex
String match mit Wildcard ODER Regex: Hallo zusammen, ich möchte ein String-Matching durchführen, wobei der Benutzer sich bei Eingabe des Suchbegriffs aussuchen kann, ob ein regulärer Ausdruck verwendet werden soll oder lediglich...
Klassen innerhalb einer jar ersetzen
Klassen innerhalb einer jar ersetzen: Hallo, Da auf meine erste Frage niemand eine Antwort wusste, versuch ich es jetzt nochmal mit einer, hoffentlich, leichteren Frage. Ich habe eine jar datei und eine klasse. Eine Klasse mit...
Regex + Match Zahlen filtern
Regex + Match Zahlen filtern: hi, ich habe noch eine Frage bezüglich der regex befehle. und zwar habe ich eine txt-datei,wo inhalte wie: 2131241241 weqe2131de 13123d qedw123 rqwr32 124124
string.match[regex] - Help !
string.match[regex] - Help !: Huhu! Ich probiere jetzt schon die ganze Zeit rum.. komm aber irgendwie auf keinen grünen Zweig.. Eine Usereingabe ( String ) soll lediglich angenommen werden wenn die Eingabe dieses Format...
Regex Match oder so
Regex Match oder so: Hallo Ich habe einen String, aus dem will ich bestimmte teile extrahieren. Also zum Beispiel: String = "blabla"; Jetzt will ich dank der Funktion piep kriegen. Regex Ausdruck würde ich schon...




Sie betrachten gerade Nur innerhalb des regex-Match ersetzen