![]() |
|
|
|||||||
| Allgemeine Java-Themen Allgemeine Themen, die nicht in andere Fachforen und nicht zu den Java Basics passen |
|
|
|
Themen-Optionen | Thema durchsuchen | Ansicht |
| #1 (permalink) | |
|
Stammbenutzer
Kilobyte
Registriert seit: 16.03.2007
Fachbeiträge: 144
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
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 (permalink) | |||||||||||||||||||
|
Stammbenutzer
Halbes Megabyte
Registriert seit: 25.12.2009
Fachbeiträge: 529
Abgegebene Danke: 22
Erhielt 89 Danke für 82 Beiträge
|
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) |
||||||||||||||||||
|
|
|
||||||||||||||||||
| #3 (permalink) | |
|
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?
|
|
|
|
| #4 (permalink) | |||||||||||||||||||
|
Stammbenutzer
Halbes Megabyte
Registriert seit: 25.12.2009
Fachbeiträge: 529
Abgegebene Danke: 22
Erhielt 89 Danke für 82 Beiträge
|
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?
|
||||||||||||||||||
|
|
|
||||||||||||||||||
| #5 (permalink) | |||||||||||||||||||
|
Stammbenutzer
Kilobyte
Themenstarter
Registriert seit: 16.03.2007
Fachbeiträge: 144
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
"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 (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:
Grüße Thomas |
|
|
|
| #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 (.*?)\\}
matcher.group() liefert den Link und nur den Link.Wenn du aber folgende Regex anwendest: Code:
(\\{@link .*?\\})
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: Geändert von Mujahiddin (27.07.2012 um 15:46 Uhr) |
|
|
|
| #8 (permalink) | |
|
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) |
|
|
|
| #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. Grüße Thomas |
|
|
|
| #10 (permalink) | |||||||||||||||||||
|
Stammbenutzer
Halbes Megabyte
Registriert seit: 25.12.2009
Fachbeiträge: 529
Abgegebene Danke: 22
Erhielt 89 Danke für 82 Beiträge
|
Was mir noch auffällt: Besser wäre auch String replString = origString.replace(".", ":"); statt String replString = matcher.group().replace(".", ":");
|
||||||||||||||||||
|
|
|
||||||||||||||||||
|
| Themen-Optionen | Thema durchsuchen |
| 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 |
|
|