RegExp capturing groups

diggaa1984

Top Contributor
hiho,

ich hab angenommen das mir dieses problem eigentlich keines darstellen sollte, aber ich bekomme nicht die groups im matcher die ich benötige.

Input: 4 ggg F
RegExp: "(\\w+\\s*)+"

Code:
start() = 0, end() = 7
group(0) = "4 ggg F"
group(1) = "F"

was ich bräuchte wäre im optimum:
group(0) = "4 ggg F"
group(1) = "4"
group(2) = "ggg"
group(3) = "F"

das ist ja noch ein einfacher ausdruck, was ich letztendlich benötige wäre minimal komplexer, aber wenn es schon auf der stufe nicht klappt ...

Weiss jemand woran das liegt? wie kann ich mir die einzelnen matches rausziehen? ich habe schon mehr capturing groups im regExp eingebaut, aber alle weiteren gruppen des matchers beinhalten lediglich den letzten match, in dem Fall immer nur "F" .. das leuchtet mir nicht ein :autsch:
 
S

SlaterB

Gast
> Weiss jemand woran das liegt?

das ist einfach, du interpretierst irgendwelche Wünsche rein in Code, den es in Java nicht gibt,
man muss vorher ungefähr kennenlernen, was RegEx sind, was Pattern und Matcher alles anbieten, paar Beispiele anschauen,

welchen Code du verwendest schreibst du gar nicht erst, anscheinend die matches()-Methode, und die bildet den ganzen String ab,
und nein, alle einzeln gefunden Gruppen für sowas wie + werden dabei nicht gemerkt,

ein Gegenvorschlag wäre folgendes Programm:
(welches ich übrigens mühevoll selber eintippen durfte, ja nie Testprogramme posten..)
Java:
public class Test {

	public static void main(String[] args) throws Exception {
		String st = "4 ggg F";
		Pattern p = Pattern.compile("\\w+\\s*");
		Matcher m = p.matcher(st);
		while (m.find()) {
			System.out.println(m.group(0));
		}
	}
}
 

diggaa1984

Top Contributor
hm mir ist schon bewusst wie man mit der Klasse umgeht, dachte jedoch das es möglich wäre derart die Groups zu ermitteln, wie ich das vorhatte. Diesen Fall benötigte ich bisher nicht, ma schaun ob ich dein beispiel auf mein eigentliches problem adapatieren kann

das Ergebnis da oben stammt aus nem Applet, ich hab dazu noch nichts selbst gecodet, aber ja beim Applet habe ich die matches-Methode verwendet, hat ja bisher immer super geklappt und das geliefert was ich wollte, nur eben diesmal nicht :)

danke dennoch
 
Zuletzt bearbeitet:

musiKk

Top Contributor
Ansonsten ist doch die split()-Methode prädestiniert für diese Aufgabe. Das hängt aber auch davon ab, was "minimal komplexer" nun genau bedeutet.
 

diggaa1984

Top Contributor
ja die Sache mit den Whitespaces war nur für das Beispiel so gewählt, im Prinzip ist diese Einschränkung momentan so im Programm vorhanden, diese möchte ich aber ausbauen .. letztendlich verarbeite ich Strings folgender Struktur:

'('Foo ')' bar x'y' .. erkennen muss ich dann: ( Foo ) bar x y

bisher mussten Leerzeichen zwischen den einzelnen Gruppen angegeben werden, aber das ist nun nicht mehr nötig.
 

musiKk

Top Contributor
Das ist imho immer das Problem bei diesem Thema. Ich würde jetzt einfach sagen, dass der Ausdrück für split() dann eben [c][' ]+[/c] lauten muss, aber wahrscheinlich gibts dann wieder andere Spezialfälle, für die das auch nicht reicht. ;)
 

diggaa1984

Top Contributor
hm so hab ich das noch gar nicht betrachtet ^^ .. aber ich bin so auf die regulären ausdrücke fixiert durch mein programm, das ich mich meist nur mit diesen herumschlage :)
 

Ähnliche Java Themen

Neue Themen


Oben