java-forum.org - Java programmieren aus Leidenschaft
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > Allgemeine Java-Themen

Allgemeine Java-Themen 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 (permalink)
TSH
Stammbenutzer
Kilobyte
 
Registriert seit: 16.03.2007
Fachbeiträge: 144
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
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();
}
TSH ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 27.07.2012, 15:03   #2 (permalink)
Stammbenutzer
Halbes Megabyte
 
Registriert seit: 25.12.2009
Fachbeiträge: 529
Abgegebene Danke: 22
Erhielt 89 Danke für 82 Beiträge
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.

Geändert von Mujahiddin (27.07.2012 um 15:09 Uhr)
Mujahiddin ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 27.07.2012, 15:23   #3 (permalink)
TSH
Stammbenutzer
Kilobyte
Themenstarter
 
Registriert seit: 16.03.2007
Fachbeiträge: 144
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
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?
TSH ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 27.07.2012, 15:28   #4 (permalink)
Stammbenutzer
Halbes Megabyte
 
Registriert seit: 25.12.2009
Fachbeiträge: 529
Abgegebene Danke: 22
Erhielt 89 Danke für 82 Beiträge
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?
Mujahiddin ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 27.07.2012, 15:34   #5 (permalink)
TSH
Stammbenutzer
Kilobyte
Themenstarter
 
Registriert seit: 16.03.2007
Fachbeiträge: 144
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
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.
TSH ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 27.07.2012, 15:37   #6 (permalink)
Neuer Benutzer
Bit
 
Registriert seit: 26.07.2012
Fachbeiträge: 7
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
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
Werzi2001 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 27.07.2012, 15:42   #7 (permalink)
Stammbenutzer
Halbes Megabyte
 
Registriert seit: 25.12.2009
Fachbeiträge: 529
Abgegebene Danke: 22
Erhielt 89 Danke für 82 Beiträge
@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
2
String origString = matcher.group(1); // "org.domain.x"
String replString = matcher.group(1).replace(".", ":"); // "org.domain.x" -> "org:domain:x" (überall!)
Regex2:
Java Code: Quelltext in neuem Fenster öffnen
1
2
String origString = matcher.group(1); // "{@link org.domain.x}"
String replString = matcher.group(1).replace(".", ":"); // "{@link org.domain.x}" -> "{@link org:domain:x}"

Geändert von Mujahiddin (27.07.2012 um 15:46 Uhr)
Mujahiddin ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 27.07.2012, 15:44   #8 (permalink)
TSH
Stammbenutzer
Kilobyte
Themenstarter
 
Registriert seit: 16.03.2007
Fachbeiträge: 144
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
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();
		}

Geändert von TSH (27.07.2012 um 15:48 Uhr)
TSH ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 27.07.2012, 15:48   #9 (permalink)
Neuer Benutzer
Bit
 
Registriert seit: 26.07.2012
Fachbeiträge: 7
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
@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
2
3
String origString = matcher.group();
String replString = matcher.group().replace(".", ":");
text = text.replace(origString, replString);

Grüße
Thomas
Werzi2001 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 27.07.2012, 15:52   #10 (permalink)
Stammbenutzer
Halbes Megabyte
 
Registriert seit: 25.12.2009
Fachbeiträge: 529
Abgegebene Danke: 22
Erhielt 89 Danke für 82 Beiträge
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
2
3
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 String replString = origString.replace(".", ":"); statt String replString = matcher.group().replace(".", ":");
Mujahiddin ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Antwort     Ist dieses Thema erledigt?

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Programm springt nicht in if Bedingung RunOrVeith Allgemeine Java-Themen 9 13.07.2011 22:07
RegEx - Ersetzen ausschließen? Daniel_L Java Basics - Anfänger-Themen 6 01.05.2010 12:24
REGEX - * durch String ersetzen Java Basics - Anfänger-Themen 3 08.11.2006 10:26
Designproblem, Regex raiL Java Basics - Anfänger-Themen 4 19.07.2006 14:23
Exception beim Speichern von eingegebenen Daten in Tabelle VanillaSky Datenbankprogrammierung 2 22.06.2004 19:27


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:41 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de