# String.replaceall - mehrere Zeichen durch eines ersetzen



## guni (17. Feb 2009)

Hallo,

ich habe einen String der so irgendwie aussieht (es handelt sich dabei um mehrere tns-einträge einer oracle datenbank): 

a =
  (b=
    (c=(d=e)(f=g))
    (h=i)
  )

j = 
  (b=
    (c=(d=k)(f=l))
    (h=m)
    (n=o)
  )

irgendwann möchte ich dahin kommen, dass das Ganze so aussieht:
a.b.c.d = e
a.b.c.f = g
a.b.h = i
j.b.c.d = k
j.b.c.f = l
j.b.h = m
j.b.n = o

ich habe noch nicht wirklich eine idee, wie ich dahin kommen könnte; hab derzeit mal folgende Schleife:

		while ((line = fh.readLine()) != null) {

			// get key-value-pairs
			line = line.replaceAll("\\s", "");
			line = line.replaceAll("\\(", "\n");
			line = line.replaceAll("\\)+", "\n");

			// skip lines with no '='
			if (!line.contains("=")) continue;

			System.out.println(line);

		}

damit krieg ich einen output, der mal ca. so aussieht:
a=

b=

c=
d=e

f=g

usw.

... ob mir das was bringt, wird sich noch herausstellen; zur Zeit stört mich aber, dass in der Zeile 

line = line.replaceAll("\\)+", "\n");

JEDE Klammer durch ein \n ersetzt wird; dabei will ich, dass auch das auftreten MEHRERER Klammern hintereinander nur durch ein einzelnes \n ersetzt wird!

Versteht irgendwer, wieso das so ist / wie man das lösen kann? 
danke!

guni

PS.: 
kann ich mir im neuen Look des Forums noch irgendwo meine beobachteten Themen anzeigen lassen?!
und wo krieg ich meine code-tags wieder her?! :-(


----------



## SlaterB (17. Feb 2009)

+ steht für ein oder mehr

schreibe
line = line.replaceAll("\\)\\)+", "\n");

oder
line = line.replaceAll("\\){2,}", "\n");
oder ähnlich, siehe Anleitung


----------



## guni (17. Feb 2009)

hallo SlaterB,

eigentlich war "ein oder mehr" auch genau meine Absicht!
wenn ich sowas
line = line.replaceAll("\\)\\)+", "\n");
schreibe, dann "zündet" der replace ja erst bei 2 Klammern ;-(

Ziel von meinem Replace soll es aber sein, eine beliebig lange Aneinanderreihung von Klammern (mindestens EINE) durch EIN \n zu ersetzen!


----------



## SlaterB (17. Feb 2009)

na gut, ich habs glaub ich begriffen, du darfst nicht ( und ) einzeln betrachten:


```
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        String line = ")) (x)(  y)))z";
        line = line.replaceAll("[\\s()]+", "O");
        System.out.println(line);
    }

}
```


----------



## guni (17. Feb 2009)

hey ... danke.
ganz blick ich zwar noch nicht hinter diesen regex-konstrukt aber ich übernehm in mal dankend, bau ihn ein, ärger mich mit dem restlichen problem und schau bei gelegenheit nach, wie dein regex-Ausdruck funktioniert ... eckige Klammern sind doch meines Wissens nach für Gruppen zuständig; aber dass sie ALLES ersetzen ist mir neu ;-)


----------



## SlaterB (17. Feb 2009)

[abc] ist eine Gruppe, hier eine Gruppe von Klammern und testweise auch Leerzeichen, welche du wohl nicht brauchst,
das + sorgt wie immer für die Mehrzahl


----------

