# Reguläre Ausdrücke, String rückwärts durchsuchen



## Capasso (18. Mrz 2009)

Hallo,

ich brauche etwas Starthilfe mit regulären Ausdrücken.

Und zwar habe ich z.B.: folgende Strings:


> Das ist ein Text. Das hier auch.





> Das ist ein Text. (Das hier auch)





> Das ist ein Text. (Das hier auch.)





> Das ist ein Text. (Das (hier) auch.)


 
Jetzt möchte ich folgendes feststellen:
- hat der String am Ende ein leerzeichen dann einen Punkt
- hat der String am Ende ein leerzeichen,dann eine Klammer ) und dann keinen Punkt und kein Ausrufezeichen
- hat der String am Ende ein leerzeichen, dann eine Klammer ), dann einen Punkt oder ein Ausrufezeichen, dann belibieg viele Zeichen außer ) und dann eine öffnende Klammer.

Dazu die erste Frage kann man den String quasi von hinten an überprüfen. (oder muss mann den String umdrehen mit text = *new* StringBuffer(text).reverse().toString();)

Und wie realisiere ich z.B. diese Abfrage: - hat der String am Ende ein leerzeichen, dann eine Klammer ), dann einen Punkt oder ein Ausrufezeichen, dann belibieg viele Zeichen außer ) und dann eine öffnende Klammer.

Gruß
Capasso
Und wie realisiere ich


----------



## MiDniGG (18. Mrz 2009)

Am einfachsten geht das wohl mit String#endsWith()


----------



## Capasso (18. Mrz 2009)

Also die ersten beiden Ausdrücke habe ich hinbekommen

aber den dritten bekomme ich nicht hin
- hat der String am Ende ein leerzeichen, dann eine Klammer ), dann einen Punkt dann beliebig viele Zeichen außer ) und dann eine öffnende Klammer.

Das funktioniert leider nicht:



> ^ \\)\\.[.^\\)]*\\(.*


----------



## fjord (18. Mrz 2009)

[highlight=java]	public static void main(String[] args) {		
		String[] strings = {
				"Das ist ein Text. Das hier auch.",
				"Das ist ein Text mit Leerzeichen vor dem Punkt .",
				"Das ist ein Text mit Leerzeichen und Klammer am Ende. (Das hier auch )",
				"Das ist ein Text mit Punkt hinter Leerzeichen und Klammer (Das hier auch ).",
				"Das ist ein Text. (Das hier auch.)",
				"Das ist ein Text. (Das (hier) auch.)",
				"Text ). Hier steht noch ein bisschen("};
		Matcher m = Pattern.compile(".* (?:\\.|\\)[^.!]?|\\)[.!][^)]*\\()$").matcher("");

		for (String s : strings) {
			System.out.println(s);
			m.reset(s);
			System.out.println("matches: " + m.find());	
			System.out.println();
		}		      
	}[/highlight]
führt zu:


> Das ist ein Text. Das hier auch.
> matches: false
> 
> Das ist ein Text mit Leerzeichen vor dem Punkt .
> ...


Entspricht das dem was du willst?

String#endsWith() könnte man für das 1. benutzen, bei den anderen beiden geht es nicht, weil es nur die Zeichen vergleicht und nicht einen regulären Ausdruck.


----------



## MiDniGG (18. Mrz 2009)

fjord hat gesagt.:


> String#endsWith() könnte man für das 1. benutzen, bei den anderen beiden geht es nicht, weil es nur die Zeichen vergleicht und nicht einen regulären Ausdruck.



Achso OK. Dann bin ich jetzt auch wieder ein bisschen schlauer ^^


----------



## Capasso (19. Mrz 2009)

Danke, das sieht schonmal ganz gut aus.

Jetzt habe ich noch eine Frage, und zwar:

Wenn man den Text hat:
  Das ist ein Text. (Das hier auch.)

Und man erkennt durch den regulären Ausdruck, das der Text ne schließende Klammer mit Punkt dann irgendwas und dann eine öffnende Klammer mit Punkt hat
Also diesen Teil -->  . (Das hier auch.)

Wie komme ich dann an das was vor dem Punkt steht. Und zwar möchte ich alles bis zum ersten Leerzeichen auslesen, also diesen Teil --> Text


----------



## fjord (19. Mrz 2009)

[highlight=java]
String s = "Das ist ein Text. (Das hier auch.)";
Matcher m = Pattern.compile("(.*)\\.\\s?\\(.*\\)").matcher(s);
if (m.find()) {
	System.out.println(m.group(1));
}[/highlight]
Willst du das wirklich ohne Punkt?

Um ein bisschen was über die Patterns zu lernen ist eigentlich Pattern (Java 2 Platform SE v1.4.2) ganz gut.
Um an Teile des gematchten Ausdrucks zu kommen benutzt man capturing groups. Das sind die Teile die durch ( und ) eingegrenzt sind. Bei dem Matcher kann man mit group(int index) auf die Gruppen zugreifen. Die 0te Gruppe ist immer der gesamte Ausdruck. Um an die erste capturing group zu kommen, also group(1).


----------

