# Per regex string zwischen klammern raussuchen



## StrikeTom (3. Aug 2010)

Wie suche ich per regex einen String zwischen zwei klammern raus?
Also so:
String irgeneinname = "2+(3-4)";
String irgeneinname2 = "3-4";
Ich verzweifle an der logik dazu
Kann mir jemand helfen?
Danke im voraus


----------



## Niki (3. Aug 2010)

```
public static String find(String s){
		Pattern p = Pattern.compile(".*\\((.*)\\).*");
		Matcher m = p.matcher(s);
		if(m.find()){
			return m.group(1);
		}
		return null;
	}
```


----------



## nrg (3. Aug 2010)

mal von deiner frage abgesehn. soll das ein parser für mathematische formeln werden?


----------



## Der Müde Joe (3. Aug 2010)

Ist das jetzt die Fortführung von dem hier:
http://www.java-forum.org/java-basics-anfaenger-themen/103258-string-mehrmals-splitten.html
?


----------



## StrikeTom (3. Aug 2010)

> mal von deiner frage abgesehn. soll das ein parser für mathematische formeln werden?


ja

DANKE

Doch irgend etwas funktioniert noch nicht so ganz:
Die funktion calc(String aufgabe) rechnet normal(ohne klammern) aus (+-*/%)
und so sieht die funktion calculate aus:

```
public double calculate(String aufgabe)
	{
		String aufgaben = find(aufgabe);
		System.out.println(aufgaben);
		aufgabe.replace(aufgaben, "" + calc(aufgaben));
		return calc(aufgabe);
	}
```
Aber die klammern werden nicht rausgenommen.
Bitte um hilfe!


----------



## SlaterB (3. Aug 2010)

aufgabe =  aufgabe.replace(..


----------



## StrikeTom (3. Aug 2010)

> Ist das jetzt die Fortführung von dem hier:
> String mehrmals splitten
> ?


Jein
also schon so einbisschen


----------



## StrikeTom (3. Aug 2010)

> aufgabe = aufgabe.replace(..


Ist das nicht das gleiche?(das funktioniert nicht)
Danke


----------



## SlaterB (3. Aug 2010)

was in deinem Programm alles nicht funktioniert kann ich nicht beurteilen, aber replace ohne Zuweisung macht absolut gar nix,
Strings sind unveränderbar, leicht zu testen:


```
public class Test
{
    public static void main(String[] args)
    {
        String a = "aaa";
        System.out.println(a);
        a.replace("a", "b");
        System.out.println(a);
        a = a.replace("a", "b");
        System.out.println(a);
    }
}
```


----------



## nrg (3. Aug 2010)

http://www.java-forum.org/allgemeines/12306-parser-fuer-mathematische-formeln.html


----------



## StrikeTom (3. Aug 2010)

> Parser für mathematische Formeln


Schon durchgelesen(ich möchte es selber schreiben und nicht copy+paste(viel verstehe ich nicht))
Das ist viel mehr code als ich habe.


----------



## SlaterB (3. Aug 2010)

'ich möchte es selber schreiben' klingt immer lustig im Zusammenhang mit Fragen im Forum, also wenn andere was machen sollen 

da noch keine richtige Reaktion kam:
hast du das mit replace nun nachvollzogen, ist noch eine Frage offen?


----------



## nrg (4. Aug 2010)

StrikeTom hat gesagt.:


> Schon durchgelesen(ich möchte es selber schreiben und nicht copy+paste(viel verstehe ich nicht))
> Das ist viel mehr code als ich habe.



ok. die Einstellung prinzipiell ist schonmal lobenswert. Allerdings ist das imho wirklich die schönste Möglichkeit sowas zu realisieren. Was verstehst du denn daran nicht? Im Grunde ist die Logik recht einfach. Sieht komplizierter aus als es ist!


----------



## StrikeTom (4. Aug 2010)

Ich muss es mir noch mal in ruhe anschauen
Danke für alle antworten


----------



## Pulma (4. Aug 2010)

StrikeTom hat gesagt.:


> Wie suche ich per regex einen String zwischen zwei klammern raus?
> Also so:
> String irgeneinname = "2+(3-4)";
> String irgeneinname2 = "3-4";
> ...



Schau dir mal das Thema LookAround-Assertion an. Das könnte dann in etwa so aussehen:

```
public static void sucheStringZwischen(String text, String anfang, String ende) {
//Bei Ausdrücken (text) mit mehreren Klammern muss noch eine Einschränkung bei .* getroffen werden
			Pattern p = Pattern.compile("(?<="+anfang+").*(?="+ende+")");
			Matcher m = p.matcher(text);
			while(m.find()) {
				System.out.println(m.group());
			}
	}

public static void main(String[] args) {
		sucheStringZwischen("2+(3-4)","\\(","\\)");
	}
```
Ausgabe:

```
3-4
```


----------

