regulärer Ausdruck/Pattern Matching auf LISTE?

Fulk

Mitglied
Hallo!

Ich möchte mittels Pattern Matching eine ArrayList von Strings mit einem regulären Ausdruck vergleichen.
Mein Code sieht folgendermaßen aus:
Code:
if(pattern != null)
	{
		for(int i=0; i<testlist.size();i++)
		{
			Pattern p = Pattern.compile(pattern);
			Matcher m = p.matcher((String)testlist.get(i));
			if(m.find()==true)
			{
			search.setPattern(pattern+"Jaa!"+i);	 //PM klappt!
			}else search.setPattern(pattern+"Nee !"+i); //PM hat nicht geklappt!
			}
		}
noch kurz ein paar Details:
- oben wird zuerst getestet ob der regEx != null ist, da dieser vom Benutzer eingegeben werden soll
- testliste ist dabei meine ArrayList mit einzelnen Strings
- das was in der if(m.find()==true){.......} steht, ist für mich erstmal nur zur Kontrolle(speziell das +i)

Kann mir jemand helfen?
Danke!
 
Ich habe es gerade nochmal ausprobiert.

Bei jeder Eingabe sagt er mir, dass er es nicht gefunden hat.
Gebe ich jedoch nichts oder nur Leerzeichen ein, so sagt er, dass er diese findet.
:(
 
Um die helfen zu können müssten wir schonmal wissen was so in deiner Liste steht und wie das pattern aussieht.

In jedem Fall soltest du das Pattern.compile nur einmal vor der Schleife machen.
 
OK, hier mal meine Testliste:
Code:
testlist.add("Das");
testlist.add("ist");
testlist.add("ein");
testlist.add("Test");
testlist.add("ob");
testlist.add("das");
testlist.add("Pattern");
testlist.add("Matching");
testlist.add("auch");
testlist.add("mit");
testlist.add("Listen");
testlist.add("funktioniert");
Das Pattern hingegen ist in dem Sinne kein eigtl. regEx, sondern vielmehr auch nur ein String, angewendet auf die Testliste bspw. "mit" oder "Das".

Das Problem ist derzeit, dass er mir immer als Index die Nummer 11 (also das letzte Element der Liste). Falls die Eingabe "funktioniert." lautet, so sagt er "Jaa!", ansonsten "Nee!".
Er prüft also immer nur das letzte Element.
 
Meine for-Schleife habe ich nun noch durch breaks ergänzt, so dass sie nun folgendermaßen aussieht:
Code:
for(int i=0;i<=testlist.size();i++)
{
	Matcher m = p.matcher((String)testlist.get(i));
	if(m.matches())
	 {
	      search.setPattern(pattern+"--> klappt! --> "+i);		//PM hat geklappt!
	      break;
	 } else 
	   {
	       search.setPattern(pattern+"--> klappt nicht! --> "+i);	//PM hat nicht geklappt!
	       break;
	  }		
}
 
Hi.
Meine for-Schleife habe ich nun noch durch breaks ergänzt, so dass sie nun folgendermaßen aussieht:
Wenn egal ist was in der Schleife passiert und du immer ein break machst, dann brauchst du keine Schleife!

Natürlich ist "mit" und "Das" auch ein reg. Ausdruck - der keine Metazeichen enthält.
Das Problem ist derzeit, dass er mir immer als Index die Nummer 11 (also das letzte Element der Liste). Falls die Eingabe "funktioniert." lautet, so sagt er "Jaa!", ansonsten "Nee!".
Er prüft also immer nur das letzte Element.
Was ist denn die Variable "search"? Du überschreibst in jedem Schleifendurchlauf den Wert von "search". D.h. logischerweise enthält search immer nur das Ergebnis vom letzten Element der Liste...

Was willst du denn eigentlich? Willst du nur bestimmen ob es eine Übereinstimmung in der Liste gibt? Willst du den Index einer Übereinstimmung zurückgeben oder den Wert des Elementes der Liste?

Gruß
 
OK,

ich habe eine Testliste, die einzelne Strings enthält.
Dann habe ich einen String (vom Nutzer übergeben --> pattern), der mit dem Inhalt der Liste verglichen werden soll.

Falls nun das pattern mit einzelnen Elementen der Liste übereinstimmt (z.B. mit dem dritten Element), so soll die Variable search den Wert "Ja!" übergeben bekommen (mittels search.setPattern("Ja!")).

Ich will also prüfen, ob es eine Übereinstimmung mit dem Inhalt der Liste gibt.
 
OK,

ich habe eine Testliste, die einzelne Strings enthält.
Dann habe ich einen String (vom Nutzer übergeben --> pattern), der mit dem Inhalt der Liste verglichen werden soll.

Falls nun das pattern mit einzelnen Elementen der Liste übereinstimmt (z.B. mit dem dritten Element), so soll die Variable search den Wert "Ja!" übergeben bekommen (mittels search.setPattern("Ja!")).

Ich will also prüfen, ob es eine Übereinstimmung mit dem Inhalt der Liste gibt.
Dann mußt du die Schleife abbrechen, wenn du eine Übereinstimmung gefunden hast. Du darfst die Schleife nicht abbrechen wenn es keine Übereinstimmung gab.

Besser wäre denn eigentlich das ganze erstmal in eine Funktion auszulagern, die true bzw. false zurückgibt wenn eine Übereinstimmung gefunden wurde.
Java:
boolean listContainsMatch(List l, Pattern p) {
  for(int i=0;i<= l.size();i++)
  {
     Matcher m = p.matcher((String) l.get(i));

     if(m.matches()) return true;
  }
  return false;
}

...

if (listContainsMatch(testlist, pattern)) {
   search.setPattern(pattern+"--> klappt! --> "+i);		//PM hat geklappt!
} else {
   search.setPattern(pattern+"--> klappt nicht! --> "+i);	//PM hat nicht geklappt!
}
Gruß
 
Zurück