Pattern und Matcher

A

Android-Newbie

Gast
Hey,

Ich bin noch recht neu in der Java-Entwicklung und bin beim Coden auf ein seltsames Problem getroffen.

Ich möchte einen String auswerten, ihn unterteilen und auf verschiedene Merkmale untersuchen. Doch klappt das ganze nicht so ganz, obwohl ich mich sicher bin, dass der Code an sich richtig ist.

Er geht in beide Zweige der if-Abfrage, doch den ersten Zweig nicht vollständig. Er führt auf erster Eben noch alles aus, doch sobald beispielsweise eine while-Schleife kommt, bricht er ab und durchläuft den zweiten Zweig. Diesesmal aber ohne Einschränkungen!

Java:
String text = "2+2+2+2+2-2-2";
Pattern patPlus = Pattern.compile("\\+");
Pattern patPlusSuche = Pattern.compile("[^\\+]");
Pattern patMinus = Pattern.compile("-");
Pattern patMinusSuche = Pattern.compile("[^-]");
Matcher matPlus = patPlus.matcher(text);
if (matPlus.find())
{
	Matcher matPlusSuche = patPlusSuche.matcher(text);;
	while(matPlusSuche.find())
	{
		Matcher matMinus = patMinus.matcher(matPlusSuche.group(0));
		if(matMinus.find())
		{
			//Hier geht er erst rein
			Matcher matMinusSuche = patMinusSuche.matcher(matPlusSuche.group(0));
			while(matMinusSuche.find())
			{
				//Hier geht er schon gar nicht erst rein
			}
		}
		else
		{
			//Hier geht er aber ebenfalls rein und schließt hier ab
		}	
	}
}
 
Zuletzt bearbeitet von einem Moderator:

eRaaaa

Top Contributor
Was soll das überhaupt werden? :autsch:

Aber ist doch klar
[java=12]
Matcher matMinus = patMinus.matcher(matPlusSuche.group(0));
if(matMinus.find())
{
//Hier geht er erst rein

[/code]

damit holst du dir nur die "-" - Strings !

Und nun machst du ein
[java=16]
Matcher matMinusSuche = patMinusSuche.matcher(matPlusSuche.group(0));
while(matMinusSuche.find())
{
//Hier geht er schon gar nicht erst rein
}
[/code]

patMinusSuche = "[^-]"
matPlusSuche.group(0) = wie schon gesagt "-"

ist doch dann klar dass du in die while-Schleife nicht rein gehst ?!
 
A

Android-Newbie

Gast
Aber ich bezieh mich doch gar nicht auf den Minus-String, sondern auf den PlusSuche-String. Also dürfte das doch gar kein Problem darstellen.
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
deine ersten Ausführeungen thematisierten unter anderem die innere while-Schleife mit der Minus-Suche
("doch sobald beispielsweise eine while-Schleife kommt, bricht er ab"),
das wurde beantwortet, jetzt sagst du dass es um ganz was anderes geht, um +,

ich habe nochmal das erste Posting gelesen kann aber nicht richtig nachvollziehen was jetzt überhaupt deine Frage ist,
eine Fragezeichen kam bisher auch noch nicht vor,
kannst du nochmal von vorne anfangen und sagen ob und was du wissen willst?
 
A

Android-Newbie

Gast
deine ersten Ausführeungen thematisierten unter anderem die innere while-Schleife mit der Minus-Suche
("doch sobald beispielsweise eine while-Schleife kommt, bricht er ab"),
das wurde beantwortet, jetzt sagst du dass es um ganz was anderes geht, um +,

ich habe nochmal das erste Posting gelesen kann aber nicht richtig nachvollziehen was jetzt überhaupt deine Frage ist,
eine Fragezeichen kam bisher auch noch nicht vor,
kannst du nochmal von vorne anfangen und sagen ob und was du wissen willst?

Gute. Ich bin gerade dabei ein Programm zu schreiben, das einen einfachen Eingabe-String mit Zahlen, Plus- und Minuszeichen aufteilt und jeweils in einer Variable addiert/subtrahiert, um ihn besser zu verarbeiten. In diesem Fall habe ich beispielhaft mal text = "2+2+2+2+2-2-2" gewählt, um eine Eingabe schnell zu simulieren.

Der erste Schritt ist es nun den String auf "+"Zeichen zu prüfen. Das mache ich mit patPlus und matPlus. Wenn das erfolgreich war (also ein "+"Zeichen gefunden wurde), unterteile ich den String zwischen allen "+"Zeichen, Anfang und Ende. Dafür brauche ich ja einen praktisch umgekehrten Pattern (also patPlusSuche und matPlusSuche), da ich alles haben will, das nicht"+" ist. Um das bis zum Ende des Strings zu machen habe ich eine while-Schleife eingebaut, die so lange aktiv ist, solange sie etwas finden kann. Der verarbeitbare String ist nun von matPlusSuche gehalten.

Der zweite Schritt ist es nun den String nach der selben Methode auf "-"Zeichen zu prüfen. Dafür hole ich mir den patMinus und matMinus, die beide mit dem String von matPlusSuche arbeiten, da dieser ja den zu prüfenden Teil-String beinhaltet. Bei Erfolg wird ebenfalls mit einer while-Schleife mit umgekehrtem Pattern gearbeitet (patMinusSuche und matMinusSuche).

Wenn ich jetzt mal mein Szenario mit dem String durchspielen würde, würde er den String erst auf "+"Zeichen überprüfen und Erfolg haben. Nun überprüft er den neu durch die while-Schleife erstellten matPlusSuche-String auf "-"Zeichen" und findet keine. Er geht normal den else-Weg. Das macht er 4 mal (wegen den ersten vier "2"en). Nun findet er aber ein "-"Zeichen und geht in den normalen if-Weg. Doch verlässt er diesen wieder und betritt ebenfalls den else-Weg, der er feinsäuberlich durcharbeitet.

Aber warum betritt er beide Arme der if-Abfrage? Ich habe das Ganze ohne Inhalt (nur CatLog-Meldung) im if-Arm probiert und einmal mit einer while-Schleife (wie im Beispiel). Beide Male scheint er in den if-Arm zu gelangen und die CatLog-Meldung auszugeben. Im while-Schleifen-Fall führt er diese noch nicht einmal aus, obwohl sie ja nach dem gleichen Muster wie oben und dem aktuellen Verarbeitungs-String matPlusSuche arbeitet.

Hier noch mal die Frage: Warum solch ein mMn annormales verhalten?
 
S

SlaterB

Gast
Nun findet er aber ein "-"Zeichen und geht in den normalen if-Weg. Doch verlässt er diesen wieder und betritt ebenfalls den else-Weg, der er feinsäuberlich durcharbeitet.
das ist einfach komplett unwahr und du lieferst kein einziges Argument, warum das so sein sollte,
die Standarderklärung dürfte sein, dass du Log-Ausgaben (die du weder erläuterst noch als Code postest) falsch interpretierst,

ein vollständig laufendes Programm ist:
Java:
public class Test {
    public static void main(String[] args)  {
        String text = "2+2+2+2+2-2-2";
        Pattern patPlus = Pattern.compile("\\+");
        Pattern patPlusSuche = Pattern.compile("[^\\+]");
        Pattern patMinus = Pattern.compile("-");
        Pattern patMinusSuche = Pattern.compile("[^-]");
        Matcher matPlus = patPlus.matcher(text);
        if (matPlus.find())  {
            Matcher matPlusSuche = patPlusSuche.matcher(text);;
            while(matPlusSuche.find())  {
                System.out.println("außen while, group: "+matPlusSuche.group(0));
                Matcher matMinus = patMinus.matcher(matPlusSuche.group(0));
                if(matMinus.find())   {
                    System.out.println("im if");
                    //Hier geht er erst rein
                    Matcher matMinusSuche = patMinusSuche.matcher(matPlusSuche.group(0));
                    while(matMinusSuche.find())  {
                        //Hier geht er schon gar nicht erst rein
                    }
                }  else  {
                    System.out.println("im else");
                    //Hier geht er aber ebenfalls rein und schließt hier ab
                }   
            }
        }
    }
}
Ausgabe:
Code:
außen while, group: 2
im else
außen while, group: 2
im else
außen while, group: 2
im else
außen while, group: 2
im else
außen while, group: 2
im else
außen while, group: -
im if
außen while, group: 2
im else
außen while, group: -
im if
außen while, group: 2
im else
für jeden Schleifendurchgang wird genau ENTWEDER der if- ODER der else-Fall durchlaufen,
nach einem if kommt vielleicht auch wieder das else dran, aber frühestens in der nächsten Runde mit neuer group, neuem if-Test
 
A

Android-Newbie

Gast
Stimmt. Ich habs noch mal nachgeprüft im eigentlichen Programm. Entschuldigung für die Ungenauigkeit.

Aber das wirft jetzt wieder die Frage auf, warum es überhaupt so weit kommt. Eigentlich dürfte ein String nur mit "-" gar nicht existieren. Die erste Schleife ist ja eigentlich darauf ausgerichtet den ursprünglichen String "2+2+2+2+2-2-2" in 5 Teile zu teilen, also "2" + "2" + "2" + "2" + "2-2-2". Aber das macht er anscheinend ja nicht sondern teilt ihn direkt in 9 Teile. "2" + "2" + "2" + "2" + "2 " "-" "2 " "-" "2". Folglich muss was falsch an meinem Pattern sein.

Pattern patPlusSuche = Pattern.compile("[^\\+]");
Matcher matPlus = patPlus.matcher(text);
while(matPlus.find()){
}

Entspricht das nicht: Unterteile den String text in Subsequences die nicht das Zeichen "+" (bzw. alle Zeichen außer das Zeichen +) enthalten?
 
S

SlaterB

Gast
aber dann ist noch die Frage, wie lange diese Subsequences sind, im Moment beschränkst du sie auf ein Zeichen,
mit "[^+]+" werden es mehr, \\ sind innerhalb der [ ] nicht nötig
 

XHelp

Top Contributor
Ich bin mir da gar nicht sicher, ob du mit RegEx hier besser aufgehoben bist.
Das ganze rekursiv zu machen und manuell nach dem nächsten Operator suchen ist imho einfacher (sofern das überhaupt zur Option steht)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Dimax Erste Schritte Pattern.matcher,die Besonderheiten. Java Basics - Anfänger-Themen 12
W RegEx Matcher + Pattern und Emails Java Basics - Anfänger-Themen 8
Bregedur Methoden Matcher und Pattern bei sich wiederholenden Werten Java Basics - Anfänger-Themen 1
Z Pattern und Matcher substring zu String möglich? Java Basics - Anfänger-Themen 4
M RegEx Pattern Matcher Java Basics - Anfänger-Themen 16
N Regexp Pattern & Matcher Problem Java Basics - Anfänger-Themen 4
T Frage zu Pattern/Matcher Java Basics - Anfänger-Themen 6
megachucky regex-Problem ( mit den Klassen Matcher / Pattern) --> XML prüfen Java Basics - Anfänger-Themen 11
0 Probleme mit Pattern und Matcher Java Basics - Anfänger-Themen 5
K Probleme mit RegEx (Pattern und Matcher) Java Basics - Anfänger-Themen 2
F Pattern und Matcher Java Basics - Anfänger-Themen 4
D was ist der vorteil vom Builder-design pattern? Java Basics - Anfänger-Themen 11
W GoF-Pattern im Programmierer-Alltag Java Basics - Anfänger-Themen 113
D Java Pattern mit X Ausgabe Stern Java Basics - Anfänger-Themen 4
J Methoden Observer-Pattern mit Consumer und accept( ) Java Basics - Anfänger-Themen 6
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
F Design pattern Java Basics - Anfänger-Themen 29
M Schlüsselworte Unterschied: String.matches und Pattern.compile Java Basics - Anfänger-Themen 2
C Best Practice JTable in MVC Pattern Java Basics - Anfänger-Themen 7
D Design Pattern Command Java Basics - Anfänger-Themen 3
fLooojava MVC Pattern und Observer Pattern Java Basics - Anfänger-Themen 6
S Regex Pattern Java Basics - Anfänger-Themen 3
B Pattern für Email Liste Java Basics - Anfänger-Themen 3
J Builder Pattern implementieren Java Basics - Anfänger-Themen 3
Tarrew Proxy Design-Pattern Java Basics - Anfänger-Themen 1
M Methoden Pattern Matching Vokal Java Basics - Anfänger-Themen 2
agent47 Pattern split Java Basics - Anfänger-Themen 2
J MVC Pattern, mehrere Controller/Views/Models Java Basics - Anfänger-Themen 0
B Strategy Pattern - Rechner Java Basics - Anfänger-Themen 6
I Vertändnisfrage zu Prototype Pattern Java Basics - Anfänger-Themen 0
L Kompositum-Pattern Hilfe :O Java Basics - Anfänger-Themen 4
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
S Je nach erhaltene Daten unterschiedlich reagieren (Design Pattern?) Java Basics - Anfänger-Themen 3
B Pattern Matching ohne Match-Methoden Java Basics - Anfänger-Themen 11
Furtano OOP Memento Pattern | übergabe einer Kopie des Arrays Java Basics - Anfänger-Themen 0
F Erste Schritte Pattern zum Zerlegen von selbstdefinierten Dateinamen Java Basics - Anfänger-Themen 7
M MVC + Strategy Pattern Ansatz (mit Code) Java Basics - Anfänger-Themen 5
A Design Pattern - Welche? Java Basics - Anfänger-Themen 33
Rudolf OOP Übungen zu Design Pattern in Java Java Basics - Anfänger-Themen 6
A Observer Pattern Problem Java Basics - Anfänger-Themen 15
J Interface Frage zu Interfces am Beispiel Observer Pattern Java Basics - Anfänger-Themen 8
S OOP Regex Pattern Java Basics - Anfänger-Themen 2
P Grundsatzfrage zu Decorator-Pattern Java Basics - Anfänger-Themen 6
L Pattern Matching Java Basics - Anfänger-Themen 3
L RegExp bzw Pattern in Java Java Basics - Anfänger-Themen 6
Helgon Observer Pattern - hasChanged() immer false Java Basics - Anfänger-Themen 10
R aktualisierung des View im MVC-Pattern Java Basics - Anfänger-Themen 5
R Pattern bzw. Regex HTML-Code Java Basics - Anfänger-Themen 10
I OOP Verständnisfrage zu Singelton Pattern Java Basics - Anfänger-Themen 21
R Welches Design pattern Java Basics - Anfänger-Themen 10
B static und Pattern matching Java Basics - Anfänger-Themen 22
T pattern klappt nicht so Java Basics - Anfänger-Themen 6
T Decorator Pattern Java Basics - Anfänger-Themen 7
D Pattern in Midi-Sequencer Java Basics - Anfänger-Themen 2
V Frage zu Decorator-Pattern Java Basics - Anfänger-Themen 4
S OOP Factory Pattern Java Basics - Anfänger-Themen 2
C OOP Observer Pattern Java Basics - Anfänger-Themen 2
M Regex-Pattern Java Basics - Anfänger-Themen 2
Haubitze_Broese Pattern für Links in RSS-Reader Java Basics - Anfänger-Themen 6
Raidri Pattern liefert false Java Basics - Anfänger-Themen 9
O useDelimiter / Muster im Parameter (Pattern) Java Basics - Anfänger-Themen 6
S Problem mit Pattern Java Basics - Anfänger-Themen 2
S Pattern.matches mit Ignore Case Java Basics - Anfänger-Themen 2
N in int array einen pattern(eine zahl) finden Java Basics - Anfänger-Themen 21
A Hilfe zu Pattern Java Basics - Anfänger-Themen 2
Y Pattern Java Basics - Anfänger-Themen 2
A Proxy Pattern implementieren Java Basics - Anfänger-Themen 2
N OOP MVC Pattern Java Basics - Anfänger-Themen 3
G Probleme mit Pattern und Aussagenlogik Java Basics - Anfänger-Themen 6
H Verständnis Strategy Pattern Java Basics - Anfänger-Themen 4
D regexp-pattern .. letzter schliff Java Basics - Anfänger-Themen 6
A ist das ein Singleton-Pattern? Java Basics - Anfänger-Themen 6
Z regexp/pattern für dateipfad Java Basics - Anfänger-Themen 5
A Factory Pattern Java Basics - Anfänger-Themen 2
D Objekte anlegen und Singleton Pattern Java Basics - Anfänger-Themen 21
O Erklärung für Pattern Java Basics - Anfänger-Themen 5
U Java Pattern Regex Java Basics - Anfänger-Themen 9
K Observer Pattern notifyObservers Java Basics - Anfänger-Themen 9
S geeignetes Such Pattern Java Basics - Anfänger-Themen 6
J Zugriff mit Visitor Pattern auf eigen erstellte verk. Liste Java Basics - Anfänger-Themen 3
J Visitor Pattern Java Basics - Anfänger-Themen 4
W Observer-Pattern Java Basics - Anfänger-Themen 3
M Singleton Pattern Java Basics - Anfänger-Themen 35
J Singleton Pattern Java Basics - Anfänger-Themen 5
J Ant pattern Erklaerung Java Basics - Anfänger-Themen 4
G Aufbau MVC-Pattern Java Basics - Anfänger-Themen 6
M Pattern Matching Java Basics - Anfänger-Themen 2
S Singleton Pattern passend hierfür? Java Basics - Anfänger-Themen 60
M Factory Pattern Ansatz falsch? Java Basics - Anfänger-Themen 6
Y Hilfe bei Pattern-Regexp Java Basics - Anfänger-Themen 5
U pattern Java Basics - Anfänger-Themen 2
A Pattern.matches(); Java Basics - Anfänger-Themen 14
A Problem mit Obser-Pattern Java Basics - Anfänger-Themen 2
P pattern/match Java Basics - Anfänger-Themen 2
K Regex Pattern Java Basics - Anfänger-Themen 4
G Vorteile Reflection bezüglich MVC-Pattern Java Basics - Anfänger-Themen 9
F regex pattern problem Java Basics - Anfänger-Themen 4
S Regex Pattern Problem Java Basics - Anfänger-Themen 2
G Singleton Pattern Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben