// Autor: Stemer Bertram
// Matr.Nr.: 0257071
// Studienkennzahl: E033535
// Beispiel: 3
// Beispielnummer: 3138
import eprog.*;
public class Compstring extends EprogIO
{
//Deklaration der Variabeln
static String sInput, sSearch, Output = "NEIN";
static String spezSign = "*^?[]\\";
static final char questionmark = '?';
static final char backslash = '\\';
static final char braceOpen = '[';
static final char braceClose = ']';
static final char exception = '^';
static final char asterik = '*';
static boolean flBrCount = false, flStLength = false, flAsterik, flBrace, flBraceSlash, flNoBraceSlash;
static int brOpCount, brClCount, asCount, countException, countAsterik, indBegin, indEnd, indBegWhile, indEndWhile;
static int indBegAsterik, indEndAsterik, indBegAstWhile, indEndAstWhile, iAst, len;
static String subString, subAstString, subInput;
static char[] subArray, sArray, iArray, spezArray, subAstArray;
//Methode um Strings einzulesen
public static void readInput()
{
sInput = readWord();
sSearch = readWord();
//prueft laenge des ersten Strings
if (sInput.length() > 30)
{
Output = "FALSCHE EINGABE";
flStLength = true;
}
//pruef laenge des zweiten Strings
else if (sSearch.length() > 30)
{
Output = "FALSCHE EINGABE";
flStLength = true;
}
} //end readInput
//Methode zur Suche des Zeichens '*'
public static String searchAsterik()
{
//Hier wird die Position des Sterns gesucht
indBegAsterik = sSearch.indexOf(asterik);
indEndAsterik = sSearch.lastIndexOf(asterik);
indBegAstWhile = indBegAsterik;
//Wenn nur ein Stern vorhanden ist, kommt die Ausgabe JA
if(indBegAsterik == 0 && sSearch.length() == 1)
{
Output = "JA";
flAsterik = true;
}
//Zaehlt die Anzahl der '*' im searchString mit asCount
while(indBegAstWhile >= 0)
{
asCount++;
indBegAstWhile++;
indBegAstWhile = sSearch.indexOf(asterik, indBegAstWhile);
}
//Wenn die Anzahl der '*' ist 1, dann diese IF-Schleife
if(asCount == 1)
{
//Wenn '*' an der ersten Stelle steht
if(indBegAsterik == 0)
{
//Erstellt einen Substring nach dem Stern und wandelt diesen in ein Array um
subAstString = sSearch.substring(indBegAsterik+1);
//Laenge fuer die Methode regionMatches wird erstellt
len = subAstString.length();
//Schleife zur Pruefung des Substringes mit der Eingabe
for(int i=0; i < sInput.length(); i++)
{
//Erstellt einen neuen Substring zum Laengenvergleich im IF-Statement
String iSubString = sInput.substring(i);
//Prueft die beiden Strings auf Gleichheit - Var i verschiebt die Pruefung immer um eine Stelle
if(sInput.regionMatches(false, i, subAstString, 0, len) && iSubString.length() == len)
{
Output = "JA";
flAsterik = true;
break;
}
}
}
//Wenn '*' an der letzten Stelle steht
else if(indEndAsterik == (sSearch.length()-1))
{
//Erstellt einen SubString ohne '*' und wandelt diesen in ein Array um
subAstString = sSearch.substring(0, (sSearch.length()-1));
subAstArray = subAstString.toCharArray();
//iArray wird hier initialisiert
iArray = sInput.toCharArray();
//
for(int i=0; i < subAstString.length(); i++)
{
//Wenn die Zeichen gleich sind, zaehlt der Counter
if(subAstArray[i] == iArray[i])
{
countAsterik++;
}
//Der Counter wird mit der laenge des Substrings verglichen
if(countAsterik == subAstArray.length)
{
Output = "JA";
flAsterik = true;
break;
}
}
}
}
//Wenn 2 '*' vorhanden und Stern steht am Anfang und am Ende
if(asCount == 2 && indBegAsterik == 0 && indEndAsterik == (sSearch.length()-1))
{
//Erstellt einen Substring zwischen '*' und wandelt diesen in ein Array um
subAstString = sSearch.substring(indBegAsterik+1, indEndAsterik);
subAstArray = subAstString.toCharArray();
//Laenge des Substrings fuer die Methode regionMatches wird erstellt
len = subAstString.length();
//Prueft die ob der Substring mit der Eingabe uebereinstimmt
for(int i=0; i < sInput.length(); i++)
{
String iSubString = sInput.substring(i);
//Prueft Uebereinstimmung zwischen Eingabe und Substring
if(sInput.regionMatches(false, i, subAstString, 0, len))
{
Output = "JA";
flAsterik = true;
break;
}
}
}
return Output;
} //end searchAsterik
//Methode zur Pruefung auf Gleichheit
public static String searchEquals()
{
//hier werden die Strings in eine Array umgewandelt
iArray = sInput.toCharArray();
sArray = sSearch.toCharArray();
//Wenn beide gleich und die Laenge 30 nicht ueberschritten und kein Stern gefunden, dann dieses IF-Statement
if(sSearch.equals(sInput) && flStLength == false && flAsterik == false)
{
Output = "JA";
flBrCount = true;
}
//Wenn im Searchstring ein Fragezeichen, dann wird dieses Statement aufgerufen
else if(sSearch.indexOf(questionmark) >= 0 && sInput.length() == sSearch.length() && flStLength == false)
{
//erstellt eine Laufzeitvariable um die beiden Arrays miteinander zu vergleichen
for(int i=0; i < sSearch.length(); i++)
{
if(iArray[i] == sArray[i] || sArray[i] == questionmark)
{
Output = "JA";
break;
}
else if(iArray[i] != sArray[i])
{
Output = "NEIN ";
break;
}
}
}
//else if(sSearch.length() != sInput.length() && flStLength == false && flAsterik == false && flBrace == false && flBraceSlash == false) Output = "NEIN";
return Output;
} //end searchEquals
//Methode um nach einem Backslash zu suchen
public static void searchBackslash(String subStrg)
{
//suche nach Backslash und gibt die Position zurueck
int indBackslash = subStrg.indexOf(backslash);
//wandelt den String spezSign in ein Array um
spezArray = spezSign.toCharArray();
subArray = subStrg.toCharArray();
//wenn ein Backslash vorhanden, dann dieses Statement
if(indBackslash >= 0 && flStLength == false && indBegin >= 0 && indEnd >=0)
{
//prueft die Position des Backslashes und schaut was dahinter kommt
for(int i=0; i < spezArray.length; i++)
{
//wenn es uebereinstimmt, dann wird das Flag gesetzt
if(subArray[indBackslash] == backslash && subArray[indBackslash+1] == spezArray[i])
{
//setzt ein Flag, wenn sonderzeichen gefunden
switch(spezArray[i])
{
case questionmark:
case braceOpen:
case braceClose:
case asterik:
case exception:
flBraceSlash = true;
break;
}
break;
}
}
}
//wenn kein Backslash, doch ein Sonderzeichen, dann diese Schleife
if(indBackslash == -1 && flStLength == false && indBegin >= 0 && indEnd >= 0)
{
//Sonderzeichen wird gesucht und setzt ein Flag
for(int i=0; i < spezArray.length; i++)
{
for(int j=0; j < subArray.length; j++)
{
if(subArray[j] == spezArray[i])
{
Output = "FALSCHE EINGABE";
flNoBraceSlash = true;
break;
}
}
}
}
} //end searchBackslash
//Methode um die Klammer zu finden
public static String searchBraces()
{
//Suche nach der eckigen Klammer und gibt die Position an
indBegin = sSearch.indexOf(braceOpen);
indEnd = sSearch.lastIndexOf(braceClose);
indBegWhile = indBegin;
indEndWhile = indEnd;
//Suche nach Ausname '^' an Stelle '['+1
int indException = sSearch.indexOf(braceOpen)+1;
//Wenn eckige Klammer Auf und Zu vorhanden
if(indBegin >= 0 && indEnd >= 0 && flStLength == false)
{
//erzeugt einen Substring zwischen den eckigen Klammer und wandelt diesn in ein Array um
subString = sSearch.substring((indBegin+1), indEnd);
//Zaehlt wieviel Klammern Auf vorhanden sind
while(indBegWhile >= 0)
{
++brOpCount;
indBegWhile = indBegWhile + 1;
indBegWhile = sSearch.indexOf(braceOpen, indBegWhile);
}
//Zaehlt wieviel Klammern Zu vorhanden sind
while(indEndWhile >= 0)
{
++brClCount;
indEndWhile = indEndWhile - 1;
indEndWhile = sSearch.lastIndexOf(braceClose, indEndWhile);
}
//Wenn Klammer Auf und - Zu vorhanden nicht aber Exception '^', dann dieses Statement
if(sArray[indException] != exception && brOpCount >= 1 && brClCount >= 1 == flNoBraceSlash == false)
{
//Ruft die Methode auf um den Backslash zu ueberpruefen
searchBackslash(subString);
if(flNoBraceSlash == false)
{
//Erzeugt Laufzeitvariabeln um die einzelnen Zeichen aus der Klammer mit dem input Array zu vergleichen
for(int i=0; i < iArray.length; i++)
{
for(int j=0; j < subString.length(); j++)
{
if(iArray[i] == subArray[j])
{
Output = "JA";
//i und j setzen die beiden for-Schleifen zurück, so dass diese abgebrochen werden.
i = iArray.length;
j = subString.length();
flBrace = true;
}
//Wenn das Ende der FOR-Schleife erreicht ist, dann passt kein Zeichen aus der Klammer
if((i+1) == iArray.length && (j+1) == subArray.length)
{
Output = "NEIN";
flBrace = true;
break;
}
}
}
}
}
//Wenn an zweiter Stelle der Klammer Auf das Zeichen Exception '^' steht
else if (sArray[indException] == exception)
{
//erzeugt einen Substring nach dem zeichen Exception '^' und vor dem Ende der Klammer Zu
subString = sSearch.substring((indBegin+2), indEnd);
searchBackslash(subString);
//Laufzeitvariable zur Pruefung ob ein Zeichen passt
for(int i=0; i < iArray.length; i++)
{
for(int j=0; j < subArray.length; j++)
{
//Bei gleichen Zeichen wird die Variable countException um eines erhoeht
if(iArray[i] == subArray[j])
countException++;
}
}
//wenn countException ist Null, dann stimmt keines ueberein
if(countException == 0 && flNoBraceSlash == false) Output = "JA";
//wenn countException ist groesser als 1, dann stimmt diese Eingabe nicht
else if(countException > 0 && flNoBraceSlash == false) Output = "NEIN";
}
//prueft auf mehrere Klammer und
else if(brOpCount > 1 && flBraceSlash == false|| brClCount > 1 && flBraceSlash == false)
{
Output = "FALSCHE EINGABE";
}
}
return Output;
} //end searchBraces
//Methode fuer die Ausgabe
public static void display()
{
if(Output != null) EprogIO.println(Output);
} //end display
} //end class