folgende Aufgabe:
Erstellen einer Methode, die aus einem String alle Wörter der Länge 7, die nicht mit einem Vokal beginnen, als String-Array zurückgibt.
Meine Methode funktioniert gut, außer wenn das Wort am Satzanfang steht. Es nimmt aber immer das Leerzeichen vor dem Wort mit rein..
wenn ich aber aus [^aeiouAEIOU]\\w{7} -> [^aeiouAEIOU]\\w{6} mache, dann fehlt der letzte Buchstabe. Jemand ne Idee wie ich den RegEx umschreiben kann?
Code:
public static String [] extractWords (String text) {
String pattern = "[^aeiouAEIOU]\\w{7}";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(text);
//erforderte Größe des Arrays berechnen
int hochzaehlen = 0;
while (m.find()) {
hochzaehlen++;
}
m.reset();
//Array fuellen
String[] array = new String[hochzaehlen];
int index = 0;
while (m.find()) {
array[index] = m.group();
index++;
}
return array;
}
//Test in main
public static void main(String[] args) {
String text1 = "Bayerin aha. Die Worte Bayerin oder Ecuador haben sieben Stellen";
String [] woerter = extractWords(text1);
for (String b : woerter) {
System.out.println(b);
}
Deine Methode, genauer Dein Ausdruck, funktioniert keineswegs gut: Du schließt für das erste Zeichen lediglich Umlaute aus, d. h. dass beispielsweise Satzzeichen, insbesondere aber Leerzeichen zum Ergebnis dazugezählt werden.
Formulier mal genau, was das erste Zeichen sein soll.
Der Zirkumflex ^ übt seine Sonderfunktion als Metazeichen innerhalb einer Zeichenklasse nur dann aus, wenn er dort als erstes Zeichen vorkommt. Der Ausschnitt (^aeiouAEIOU) deines Ausdrucks fügt deiner Zeichenklasse also nur die drei Zeichen (^) als gültig hinzu (die Vokale sind an der Stelle ja ohnehin bereits gültig). Dein offenbar beabsichtigtes Prinzip, erst eine Menge von Zeichen als "gültig" und anschließend eine Teilmenge davon als "doch nicht gültig" zu deklarieren, funktioniert so nicht. Eine Zeichenklasse ist also entweder insgesamt invertierend oder insgesamt nicht invertierend. Allerdings kannst du dabei alle vordefinierten Zeichenklassen nutzen, unter denen es ja auch invertierende und nicht invertierende gibt.
ach mensch.. glaub passt doch net wirklich. Es findet mir so auch entsprechende Wörter innerhalb eines Wortes. (z.B aus bestellen dann das "stellen")..
heisst das \\b nicht, dass zuerst eine Wortgrenze kommen soll ?!
hab mich wieder verwirren lassen sorry... alles gut. Hab jetzt noch ans Ende //b gehängt, somit erkennt des jetzt bestellen gar nicht mehr, da es ja mehr als 7 Stellen hat.