Suchwörter in einen Text ersetzen

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
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:

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
 
Würds ungefähr so machen (keine Garantie :wink🙂 :

Code:
Pattern pat = Pattern.compile("(.*\\W+)(suchwort)(\\W+.*)");
Matcher mat = pat.matcher(suchstring);
while(mat.matches())
{
    suchstring = mat.group(1)+ersetzen+mat.group(3);
}
 
Mit den Klammer werden Capturing-Groups festgelegt.
(.*\\W)
.* bedeutet jedes Zeichen (ausser Zeilenumbruch beliebig oft )
\\W bedeutet das nach dem .* ein non-Word-Character folgen muss (da du sagtest nur freistehende Wörter)
schau dir das mal an:
Pattern
 
Hallo Wildcard,

erstmal nochmals vielen Dank.
Ich habe es gerade noch einmal ein bisschen länger versucht und meine mit meinem Leienwissen das Problem im Pattern zu sehen.
..kommt es bei den Ausdrücken auf die Java-Version an? ..ich habe 1.42

Vielleicht habe ich auch einen Fehler bei übertragen gemacht:

Code:
for (int j = 0; j < zeilen.size(); j++) 
		{
			
			for (int i = 0; i < swoerter.size(); i++)
			{	
				
				p = Pattern.compile("(.*\\W+)((String)swoerter.get(i))(\\W+.*)");
				m = p.matcher((String)zeilen.get(j));				
				
				while(m.matches())
				{
    				zeilen.set(j, m.group(1)+"Link: "+(String)swoerter.get(i)+m.group(3)); 
    				}	
			}
		}

Viele Grüße Robin
 
will ja nicht meckern, aber wozu gibts

\b = word boundary

also

\\b(suchwort)\\b

oder so ähnlich sollte es tun

BTW

wenn ein regex mit .* anfängt, dann matcht der IMMER gegen alles (weil "gierig"), sollte man normalerweise vermeiden
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben