regex wörter aus satz filtern

zu1u

Mitglied
hey zusammen,
ich hab folgendes Problem:
Aus einem Satz sollen einige Wörter einer Liste entfernt werden. Die Wörter können überall im Satz stehen. Wenn diese zu entfernenden Wörter teil eines Wortes sind sollen diese nicht entfernt werden. Wo ein Wort anfängt oder aufhört ist durch eine Anzahl von Zeichen bestimmt.

Ich habe eigentlich schon einen Ansatz, nur kommt mir dieser zu kompliziert vor.. aber ich habe keine idee wie ich das vom Prinzip her einfacher gestalten könnte. Habt ihr vieleicht eine Idee?

Hier der code, hoffe soweit ohne großartig kommentare verständlich.

Java:
	Matcher titleMatcher;
	Pattern wordPattern;
	
	// title only one word, the stopword
	if(title.toLowerCase().equals(word.toLowerCase())) {
		title = "";
		return;
	}
            
            // filter stopword as first word in title
            StringBuffer buffer = new StringBuffer();
            String patternFirstWord = word.toLowerCase() + wordSeparatorPattern;
            wordPattern = Pattern.compile(patternFirstWord);
            titleMatcher = wordPattern.matcher(title.toLowerCase());
            if(titleMatcher.find() && titleMatcher.start()==0)
                titleMatcher.appendReplacement(buffer, "");
            titleMatcher.appendTail(buffer);
            
            // filter stopword as last word in title
            String patternLastWord = wordSeparatorPattern + word.toLowerCase();
            wordPattern = Pattern.compile(patternLastWord);
            titleMatcher = wordPattern.matcher(buffer.toString().toLowerCase());
            while(titleMatcher.find()) {
                if(titleMatcher.end()==buffer.length()) {
                    buffer = new StringBuffer();
                    titleMatcher.appendReplacement(buffer, "");
                }
            }
            
            // filter stopwords somewhere within the title
            String patternWithinTitle = "(" + wordSeparatorPattern + word.toLowerCase() +  ")+" + wordSeparatorPattern;
            wordPattern = Pattern.compile(patternWithinTitle);
            titleMatcher = wordPattern.matcher(buffer.toString().toLowerCase());
            title = titleMatcher.replaceAll(" ");
 
Zuletzt bearbeitet:
Nutz doch bitte [.java] Tags dann wird auch die Syntax angezeigt.

Erklaer ma was du dir denkst was er tun soll. Sehe ich richtig das du einen Text hast und sollst dort Woerter entfernen die in einer Liste definiert sind?
 
ja genau, wie bereits oben geschrieben.

Zusätzlich könnte ich vieleicht noch erklären
word ist das Wort das aus dem Satz herausgefiltert werden soll
title ist der Satz
wordSeparatorPattern ist das Pattern das alle Zeichen beschreibt die an Worte grenzen... also Z.b. " " oder "."

Beispielsatz dazu vieleicht noch:
Aus
"Der mörder ist dermaßen intelligent der der. Der ist der."
so daraus soll dann quasi
"mörder ist dermaßen intelligent. ist." werden

Ich habe den Code ncohmal editiert... da mir selbst noch eine vereinfach eingefallen ist..
Im ersten Absatz vom Code will ich halt das Wort filtern, falls es am Anfang vom Satz auftaucht, im zweiten wenn es am Ende vom Satz ist, und im letzten falls es irgendwo dazwischen ist.
Ich habe es deshalb so gemacht, weil bei den ersteren beiden Fällen ich ja das Pattern nicht so anwenden kann, wie ich es im letztern Fall mache... Am Anfang bzw. am Ende vom Satz ist ja mit keinem wordSeparatorPattern mehr zu rechnen.
 
Wenn das wordSeparatorPattern Leerzeichen und Punkte beschreibt, ist doch nur das erste Wort in einem Satz anders. Ein Wort zwischendrin faengt mit wordSeparatorPattern an und hoert mit wordSeparatorPattern auf, genauso aber auch ein Wort was am Ende vom Satz steht.
"Leerzeichen der Punkt"
wordSeparatorPattern Wort wordSeparatorPattern.

Faengt nen Satz denn in ner neuen Zeile an, dann koenntest du das auch noch als wordSeparatorPattern nutzen. Wenn er net in ner neuen Zeile anfaengt, faengt er doch auch mti nem Leerzeichen an :D
 
also, es geht bei dem ganzen nicht um texte, sondern eine Zeile mit Worten.
Allerdings müssen aus der auch erstmal die Worte gründlich gefiltert werden, sonst bräucht ich es ja nicht machen. Das nur das erste und as letzte "Wort" im "Satz" eine besondere Rolle zukommt weiss ich ja... ich frag mich nur ob man nicht irgendwie doch das ganze "Problem" in ein Pattern stecken kann.
Das am Ende der Zeile ein . kommt ist nicht garantiert... es geht hierbei nicht um gramatikalisch korrekte deutsche sätze...
wordSeparatorPattern kann beliebig sein...
 
Zuletzt bearbeitet:
Hallo,

warum nicht einfach so?
Java:
package de.tutorials;

import java.util.Arrays;
import java.util.regex.Pattern;

public class BadWordFilter {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Iterable<String> badWords = Arrays.asList("bad","xxx","sex","bubu");
        String text = "XXX Aababa dab bad staatsexamen BUBU baba aba baaadbdabad xbaxx xxx sex badd BaD xXx";
        
        
        System.out.println("Original: " + text);
        System.out.println("Filtered: " + filter(text,badWords));
        
    }

    private static String filter(String text, Iterable<String> badWords) {
        String filtered = text;
        
        for(String badWord: badWords){
            filtered = Pattern.compile("\\b" + badWord + "\\b", Pattern.CASE_INSENSITIVE).matcher(filtered).replaceAll("");
        }
        
        return filtered;
    }

}

Ausgabe:
Code:
Original: XXX Aababa dab bad staatsexamen BUBU baba aba baaadbdabad xbaxx xxx sex badd BaD xXx
Filtered:  Aababa dab  staatsexamen  baba aba baaadbdabad xbaxx   badd

Gruß Tom
 
weil ich genau nach sowas gesucht, aber irgendwie nicht gefunden hab.. wohl ungenügend geschaut ;)

danke!
 

Neue Beiträge

Zurück