G
Guest
Gast
Hallo liebes JavaForum,
ich habe ein Problem mit dem Erstetzen von vorgebenen Wörtern innerhalb eines String bzw. einer LinkedList von Strings. Es sollen nur "freistehende" Wörter markiert werden, aber auch vor oder hinter Satzzeichen und zu Beginn der Zeile.
Ich möchte, bevor ich meinen bisherigen Ansatz zeige hier ein Beispiel bringen:
Es seien die Suchwörter: "Java", "Programm", "Insel", "Forum"
Und der BeispielText:
Java ist eine Insel-aber auch ein Programm. Wer Hilfe sucht sollte ein Forum aufsuchen (Java-Forum).
Ersetzt werden sollten also:
Java ist eine Insel-aber auch ein Programm. Wer Hilfe sucht sollte ein Forumaufsuchen (Java-Forum).
Ein Bekannter hat mir zu Regular Expressions geraten, und wie ich hier auf der Suche lesen konnte ist dies wohl auch der richtige Ansatz. Leider ist meine Idee aber zu umständlich und schafft Probleme zu Zeilenbeginn.
Hier kommt der (Quäl)Code:
Ich weiß, dass es hierbei um eine äußerst unkonventionelle und ebenso umständliche Weise handelt, aber so ist gerade das der Grund meines Post.
Ich würde mich freuen, wenn mir jemand helfen könnte.
Vielen Dank
Robin
ich habe ein Problem mit dem Erstetzen von vorgebenen Wörtern innerhalb eines String bzw. einer LinkedList von Strings. Es sollen nur "freistehende" Wörter markiert werden, aber auch vor oder hinter Satzzeichen und zu Beginn der Zeile.
Ich möchte, bevor ich meinen bisherigen Ansatz zeige hier ein Beispiel bringen:
Es seien die Suchwörter: "Java", "Programm", "Insel", "Forum"
Und der BeispielText:
Java ist eine Insel-aber auch ein Programm. Wer Hilfe sucht sollte ein Forum aufsuchen (Java-Forum).
Ersetzt werden sollten also:
Java ist eine Insel-aber auch ein Programm. Wer Hilfe sucht sollte ein Forumaufsuchen (Java-Forum).
Ein Bekannter hat mir zu Regular Expressions geraten, und wie ich hier auf der Suche lesen konnte ist dies wohl auch der richtige Ansatz. Leider ist meine Idee aber zu umständlich und schafft Probleme zu Zeilenbeginn.
Hier kommt der (Quäl)Code:
Code:
public static LinkedList setze_links(String text)
{
//Der Text wird in seine Zeilen geteilt und speichern in der LinkedList "Zeilen" abgelegt.
Pattern p = Pattern.compile("[\n]");
String [] tzeilen = p.split(text);
LinkedList zeilen = new LinkedList();
for (int i = 0; i < tzeilen.length; i++) zeilen.add(tzeilen[i]);
String save;
Matcher m;
for (int j = 0; j < zeilen.size(); j++)
{
//Der Text wird in seine Wörter zerlegt und das WortArray wird an die Methode finde_Links übergeben
p = Pattern.compile( "[ \t!?,.]");
LinkedList links = finde_links(p.split((String)zeilen.get(j)), sw);
//Nun wird für jeden Link der Text geprüft, on auch wirklich (immer) ausgetauscht werden kann
for (int i = 0; i < links.size(); i++)
{
//Wir suchen für jeden Link nach den Treffern in der entsprechenden Zeile
p = Pattern.compile("[ \t!?,.]"+(String)links.get(i)+"[ \t!?,.]");
m = p.matcher(" "+(String)zeilen.get(j)+" ");
/* Solange Treffer gefunden werden, sollen diese
zuerst gespeichert und dann korrekt ausgetauscht werden.
Danach wird die Zeile abgelegt und das neue Pattern erstellt*/
while (m.find())
{
save = m.group();
save = m.replaceFirst(save.charAt(0) + "[" +save.substring(1, save.length()-1)+ "]"+ save.charAt(save.length()-1));
zeilen.set(j, save.substring(1,save.length()-1));
m = p.matcher(" "+(String)zeilen.get(j)+" ");
}
}
}
return zeilen;
}
//Die Hilfsmethode "finde_links" vergleicht die Textteile mit den Suchwörter
//und übernimmt Treffer in das Link-Array.
public static LinkedList finde_links(String [] twoerter, LinkedList Sw)
{
LinkedList links = new LinkedList();
Datenbank SuchwortDB = new Datenbank('s');
for (Enumeration temp = SuchwortDB._datastorage.keys(); temp.hasMoreElements(); temp.nextElement())
swoerter.add(temp);
for (int i = 0; i < twoerter.length; i++){
for (int j = 0; j < swoerter.size(); j++)
if (((String)swoerter.get(j)).equalsIgnoreCase(twoerter[i]) && (links.contains(twoerter[i]) == false))
links.add(twoerter[i]);
}
return links;
}
Ich weiß, dass es hierbei um eine äußerst unkonventionelle und ebenso umständliche Weise handelt, aber so ist gerade das der Grund meines Post.
Ich würde mich freuen, wenn mir jemand helfen könnte.
Vielen Dank
Robin